make 只支持三种类型,分别是 slice、map 和 chan,某种意义上,这三种类型也能算是引用类型,返回引用的指针相对于直接使用引用本身也没有什么优势可言,还要多一块内存保存指针。就好像当你用到整型变量,也不会专门去用 new 创建,而是直接定义。

指针能减少函数参数和返回的变量拷贝,而 map、slice 和 chan 底层数据保存在指针类型中,不会出现大量拷贝的情况发生。Go 函数返回指针还有牵涉到逃逸分析,相对于此,引用则比较轻量,不是任何情况下址传递都是值得的。

那对于这类引用类型,在什么情况下用指针呢?主要还是在需要更新数据时使用它。

Go 为什么不是像其他语言一样,只有 new 就可以了?因为 Go 没有构造函数,new 创建返回的是变量指针,只会初始化零值。对于像 slice、map 这样的引用类型,如果直接使用 new,只会创建一个指向 nil 的指针。

如下是一段简单的测试代码:

make 则可以对 slice、map 类型变量的内部进行初始化。

参考


欢迎关注我的专栏,Golang 之旅,见证我的 Golang 学习历程。