make
用于初始化内置的数据结构,如slice,map,channelnew
的作用是根据传入的类型分配一片内存空间并返回指向这片内存空间的指针1
2
3slice := make([]int, 0, 100)
hash := make(map[int]bool, 10)
ch := make(chan int, 5)slice
是一个包含data,cap和len的结构体reflect.SliceHeader
hash
是一个指向runtime.hmap
结构体的指针ch
是一个指向runtime.hchan
结构体的指针
1 | i := new(int) |
上述代码片段两种初始化方法是等价的,它们都会创建一个指向int零值的指针
make
在编译期间的类型检查阶段,go语言会将代表make
关键字的OMAKE
节点根据参数类型的不同转换成了OMAKESLICE
、OMAKEMAP
和OMAKECHAN
三种不同类型的节点,这些节点会调用不同的运行时函数来初始化相应的数据结构。
new
编译器会在中间代码生成阶段通过以下两个函数处理该关键字: