初学 golang 时,如果对指针不太了解的话,经常会在指针这个概念中给搞晕,所以这里就记录下初学 golang 时对指针的理解。
首先各种 golang 学习书籍中,会遇到这样的介绍。
指针(pointer)概念在 Go 语言中被拆分为两个核心概念:
- 类型指针,允许对这个指针类型的数据进行修改。传递数据使用指针,而无须拷贝数据。类型指针不能进行偏移和运算。
- 切片,由指向起始元素的原始指针、元素数量和容量组成。
认识指针地址和指针类型
每个变量在运行时都拥有一个地址,这个地址代表变量在内存中的位置。Go 语言中使用 &
作符放在变量前面对变量进行“取地址”操作。
格式如下:
ptr := &v // v的类型为T
其中 v 代表被取地址的变量,被取地址的 v 使用 ptr 变量进行接收,ptr 的类型就为 *T
,称做 T 的指针类型。*
代表指针。
例2:
x:=1
y:=&x
fmt.Printf("x=%d\n",x) // x=1
fmt.Println(y) // 0xc0000823f8 //内存地址
*y=8
fmt.Printf("x=%d\n",x) //x=8
上面的例子中,y 就是一个指针类型,如果遇到下面这样的声明方式
例3:
var x int
var y *int //表示y 是一个指向int类型变量的内存地址
a=1
y=&x
这个举例中,第一行 var x int
和 第三行 a=1
其实就是例 2 中第一行的详细声明方式,例二中只是一个简明的方法;第二行和第四行也就是例 2 中第二行的详细声明方式。