Golang 杂项笔记

1. make 和 new 关键字

  • make 用于创建并初始化 slice、map、chan,使其处于可用状态 (同时分配的空间自动分配零值)
  • new 用于为任意类型分配零值内存,并返回该类型的指针 (注意 make 只能初始化内建类型, 自定义结构体需要 new)
1
2
3
// len: 5, cap: 6
s0 := make([]int, 5, 6)
s1 := new(MyStruct)

如果用 new 去初始化 slice 会得到一个 ptr == nil 的 slice 对象,相当于没有分配底层数组。这符合 new 的行为但是工程上不合适,这导致我们需要这么做:

1
2
3
// s 的类型是 *int
s := new([]int)
*s = make([]int, 1)

有点幽默了 :XD
个人理解 make 就像是内建类型初始化的专用语法糖,能把复杂的对象自动初始化完全。而 new 只是单纯用于简单结构的初始化(内存分配和设置零值)