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