Go语言中make函数为何不返回指针?赋值拷贝相关疑问
关于Go中make函数赋值的疑问解答
首先明确结论:不会产生二次分配,也不会拷贝新分配的底层对象。
原因在于Go中make仅用于创建slice、map、chan这三种引用类型,这些类型的本质是包含底层数据指针的小结构体:
- 以你的代码示例
variable := make([]int, 4, 7)为例:make会在内存中分配一块长度为7的int数组(底层对象);- 返回一个
[]int类型的slice结构体,这个结构体包含三个字段:指向底层数组的指针、当前长度(4)、容量(7); - 赋值给
variable时,只会拷贝这个小结构体(总共24字节左右,取决于平台),而不会触碰底层的数组,自然不会产生二次分配或底层对象拷贝。
对比new函数:new返回的是指向类型的指针,比如new([]int)返回*[]int,赋值时拷贝的是指针本身。而make返回的是引用类型的实例(即那个小结构体),虽然不是指针,但这个结构体本身就持有底层数据的指针,所以赋值操作的开销极小,且不会复制底层的大对象。
简单来说,引用类型的赋值都是拷贝"句柄"(slice结构体、map指针结构体等),而非拷贝底层数据,这也是Go语言设计的优化点。
内容的提问来源于stack exchange,提问作者rmatthews
相关产品推荐
相关产品推荐

