go的指针采用了c语言指针的语法,我们需要特别关注&和*,&表示地址操作符,可以得到指定变量的内存地址。

abc := 10
fmt.Println(&abc)

打印出来的是abc的地址,我们可以通过在变量前面加*对其进行解引用

fmt.Println(*abc)

打印出来是10

指针类型可以跟其他普通类型一样,出现在所有需要用到类型的地方,如变量声明、函数形参、返回值类型、结构字段类型等。

var abc *string
fmt.Printf("abc is a %T\n",abc)

打印出abc is a string

所以指针的基本用法就是使用变量指向一个地址,通过&前缀来表示地址,通过前缀*来解引用得出具体变量的值。

也可以通过前缀*来对具体的值进行修改。

var tt *string
mn := "abc"
tt = &mn
*tt = "tt"
fmt.Println(*tt)

指针经常会跟结构体一起使用,如果把结构体当做参数,想要修改结构体的值,传递结构体指针是比较好的方法

type Hero struct {
Name string
}
hero := &Hero{
Name:"刘备"
}

在函数中使用hero.Name就可以修改Name的值。

跟结构体一样,我们也可以通过将地址操作符&放置在数组复合字面量的前面来创建指向数组的指针。

abc := &[3]string{"aaa","bbb","ccc"}
fmt.Println(abc[0])

可以直接通过索引来自动实施解引用,没必要写成(*abc)[0]。