理解指针和引用从C的角度应该是更合适。指针概念公认是比较难理解,我这里也不会详细说明。这里就简单粗暴的说成是:保存内存地址的类型。为什么这么说呢?指针变量在Go中就是保存一连串的十六进制数的变量。
package main
import (
"fmt"
)
func main() {
a := 0
pointer := &a
fmt.Printf("addr: %p\n", pointer) // 输出:addr: 0xc000020108
}
在0xc000020108这个虚拟内存地址上保存了变量a的值:0。
那什么Go中的引用呢?简单来说就是:包含指针成员的结构体。如slice类型。下面直接看一个C定义引用类型的例子:
struct c_slice {
pointer_t under_array;
int len;
int cap;
}
Go的slice类型的定义也是类似的。有的人也把引用叫做胖指针,为什么说是胖的呢?从上面的定义可以看出,引用对裸指针进行了扩展,添加了数据成员,对裸指针进行限制。在Go中,引用类型和其他自定义的数据(带有指针)类型没有区别。那为什么要强调引用这么个概念呢?因为Go都是以浅拷贝(值)的方式传递数据的。就是说像slice这样的类型,如果作为参数传递时,其底层的under_array并不会进行拷贝,而是传递under_array的指针。强调引用类型的概念,能提醒使用者注意“安全”。