之前在论坛看到一个帖子:go make 与 new 关键词的区别
翻看评论区发现有的解释也是错误的,于是查阅资料,把正确的结论整理。
评论区有贴官方的说明:https://go.dev/ref/spec#Allocation
Allocation 分配
The built-in function new takes a type T, allocates storage for a variable of that type at run time, and returns a value of type *T pointing to it. The variable is initialized as described in the section on initial values.
内置函数 new
传入一个类型 T,将在运行时为该类型的变量分配存储,并且返回指向这个变量 *T 类型的指针,这个变量将被初始化为默认值。
new(T)
示例
type S struct { a int; b float64 }
new(S)
allocates storage for a variable of type S, initializes it (a=0, b=0.0), and returns a value of type *S containing the address of the location.
为这个类型为 S
的变量分配存储,初始化它为(a=0,b=0.0),并且返回包含它地址信息的 *S
。
Making slices, maps and channels
The built-in function make takes a type T, optionally followed by a type-specific list of expressions. The core type of T must be a slice, map or channel. It returns a value of type T (not *T). The memory is initialized as described in the section on initial values.
内置函数 make
传入的参数是一个特定类型的可选列表,核心类型必须是 slice
, map
或 channel
中的一个。它返回 T 值(而非 *T),内存会被默认值初始化。
调用方式 核心类型 结果
make(T, n) slice 创建值类型为T,长度和容量都为 n 的 slice
make(T, n, m) slice 创建值类型为T,长度为我长度 n,容量 m 的 slice
make(T) map 存储 T 类型的 map
make(T, n) map T 类型的 map,容纳大约 n 个元素
make(T) channel T 类型的无缓冲 channel
make(T, n) channel 类型为 T 且长度为 n 的缓冲 channel
Calling make with a map type and size hint n will create a map with initial space to hold n map elements. The precise behavior is implementation-dependent.
调用 make 创建 map
类型并且指定 n 参数将会初始化容纳 n 个元素的空间,具体的行为取决于实现。
总结
- make 的作用是为 Slice、Map 和 Channel 类型的数据结构申请空间并初始化后返回实例对象本身。
- new 的作用是根据传入的类型开辟内存空间,将新开辟的内存空间设置为类型的零值,然后返回这块内存区域的指针。