所谓引用类型,是指其内部结构,而非分配于托管堆。
- slice、map、channel
- 使用 make 或初始化语句创建实例。
- 使用 new 无法有效初始化。
从实现角度看,除 slice、interface是结构体外,map、channel、function 都是指针。
引用类型对初学者来说很容易造成误解。在 Go 语言里 slice、map、channel 三种类型称之为引用类型,Java 或者 C# 语言明确区分值类型和引用类型,值类型默认情况下在栈上分配,引用类型在堆上分配,垃圾回收器在托管堆上处理。值类型会涉及到装箱和拆箱。
Go语言的引用类型只是一种行为上的概念,所谓的引用类型更多的时候指的是它引用另外一块或者多块内存,用另外一块或者多块内存来存储或者处理一些相关的数据结构,至于这两块内存分配栈上还是堆上是由编译器决定的。任何时候编译器优先在栈上分配,避免对垃圾回收器造成负担。
所以所谓的引用类型,它内部需要引用另外一块内存,引用另外一块内存也就意味着必须有初始化的操作。切片引用另外一块数组,字典引用哈希桶。
m := make(map[string]int)
使用make
初始化,从抽象层面上来看m
是一个字典,