You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中make函数为何不返回指针?赋值拷贝相关疑问

关于Go中make函数赋值的疑问解答

首先明确结论:不会产生二次分配,也不会拷贝新分配的底层对象。

原因在于Go中make仅用于创建slice、map、chan这三种引用类型,这些类型的本质是包含底层数据指针的小结构体:

  • 以你的代码示例variable := make([]int, 4, 7)为例:
    1. make会在内存中分配一块长度为7的int数组(底层对象);
    2. 返回一个[]int类型的slice结构体,这个结构体包含三个字段:指向底层数组的指针、当前长度(4)、容量(7);
    3. 赋值给variable时,只会拷贝这个小结构体(总共24字节左右,取决于平台),而不会触碰底层的数组,自然不会产生二次分配或底层对象拷贝。

对比new函数:new返回的是指向类型的指针,比如new([]int)返回*[]int,赋值时拷贝的是指针本身。而make返回的是引用类型的实例(即那个小结构体),虽然不是指针,但这个结构体本身就持有底层数据的指针,所以赋值操作的开销极小,且不会复制底层的大对象。

简单来说,引用类型的赋值都是拷贝"句柄"(slice结构体、map指针结构体等),而非拷贝底层数据,这也是Go语言设计的优化点。

内容的提问来源于stack exchange,提问作者rmatthews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 18:42:01