Go 语言里面也有指针。这个在 C/C++ 中存在的东东,非常地骇人听闻,特别是没有学过 C/C++ 的开发人员。
我不打算细说什么是指针(本文不区分指针和地址),只是今天同事遇到了一个指针相关的问题。我就简单说几句,关于变量的指针与指针变量。
指针是一个内存地址,是一个值。指针变量是一个变量,它的值是一个指针。而变量的指针是说对变量取地址得到的结果(即指针)。
特别注意的是:Go语言中,参数的传递只有按值(By Value)传递一种,没有按引用(By Reference)传递。(有异议?欢迎讨论)
所以:如果要在一个函数内通过参数修改外部变量的值,那么,只能传递该变量的指针。
比如下面一个函数:
func fn(p *int) {
}
下面的两种调用方式,有些人分不太清楚:
// 方式1
func main() {
var p *int
fn(p)
}
// 方式2
func main() {
var a int
fn(&a)
}
以上两种方式中,fn
接受的参数类型都是*int
,但是值却有所不同。
- 对于方式1,其值来源于一个指针变量,它的值是
nil
; - 对于方式2,其值来源于一个变量的指针,它的值是
a的地址
;
所以,如果在fn
内修改外部变量的值,应该这样:
func fn(p *int) {
*p = 6; // 解引用(Dereference),然后赋值
}
注:切勿被解引用这个翻译给弄糊涂了,我也不知道为什么叫 Dereference,我觉得叫**解指针(De-Pointer)**更妥当。
切不可使用p = ?
的语法,因为p
其实是个相对于fn
函数而言的局部变量,修改它本身对外界没有任何影响。
这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。