[Go] 变量的指针 与 指针变量

陪她去流浪 桃子 2018年08月12日 编辑 阅读次数:2314

Go 语言里面也有指针。这个在 C/C++ 中存在的东东,非常地骇人听闻,特别是没有学过 C/C++ 的开发人员。

我不打算细说什么是指针(本文不区分指针和地址),只是今天同事遇到了一个指针相关的问题。我就简单说几句,关于变量的指针指针变量

指针是一个内存地址,是一个值。指针变量是一个变量,它的值是一个指针。而变量的指针是说对变量取地址得到的结果(即指针)。

特别注意的是:Go语言中,参数的传递只有按值(By Value)传递一种,没有按引用(By Reference)传递。(有异议?欢迎讨论)

所以:如果要在一个函数内通过参数修改外部变量的值,那么,只能传递该变量的指针。

比如下面一个函数:

1
2
3
func fn(p *int) {

}

下面的两种调用方式,有些人分不太清楚:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 方式1
func main() {
    var p *int
    fn(p)
}

// 方式2
func main() {
    var a int
    fn(&a)
}

以上两种方式中,fn接受的参数类型都是*int,但是值却有所不同。

  • 对于方式1,其值来源于一个指针变量,它的值是nil
  • 对于方式2,其值来源于一个变量的指针,它的值是a的地址

所以,如果在fn内修改外部变量的值,应该这样:

1
2
3
func fn(p *int) {
    *p = 6; // 解引用(Dereference),然后赋值
}

注:切勿被解引用这个翻译给弄糊涂了,我也不知道为什么叫 Dereference,我觉得叫**解指针(De-Pointer)**更妥当。

切不可使用p = ?的语法,因为p其实是个相对于fn函数而言的局部变量,修改它本身对外界没有任何影响。

标签:Go · 指针