Golang 中 new 和 make 的区别

Published: 2022-04-09

Tags: Golang

本文总阅读量

之前在论坛看到一个帖子: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, mapchannel 中的一个。它返回 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 的作用是根据传入的类型开辟内存空间,将新开辟的内存空间设置为类型的零值,然后返回这块内存区域的指针

参考