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.SliceHeaderhash是一个指向runtime.hmap结构体的指针ch是一个指向runtime.hchan结构体的指针
1 | i := new(int) |
上述代码片段两种初始化方法是等价的,它们都会创建一个指向int零值的指针
make
在编译期间的类型检查阶段,go语言会将代表make关键字的OMAKE节点根据参数类型的不同转换成了OMAKESLICE、OMAKEMAP和OMAKECHAN三种不同类型的节点,这些节点会调用不同的运行时函数来初始化相应的数据结构。
new
编译器会在中间代码生成阶段通过以下两个函数处理该关键字: