Go语言中的new和make很容易混淆。 列个表格来阐述两者之间的不同和适用场景。
new | make | |
---|---|---|
返回值 | 内存地址(指针) | 对象本身 (但是slice, map, chan本身是一个包含一个指向实际数据的指针的轻量级的对象) |
初始化 | 对分配的内存做零值初始化,即内存里全部赋值成零。 | 会根据<length>, <capacity>等参数分配需要的空间,使得slice, map, chan的内部指针不为nil |
适用场景 | 一般类型 等价于 &T{} | 创建slice,map,chan (切片、映射、通道) |
代码模板 | new([]int] | make([]T, [<length>], [<capacity>]) make(map[T1]T2, [<capacity>]) make(chan T) |
示例代码 | make([]int) make([]int, 10, 100) make([]int, 10) make(map[string]string) make(map[string]string, 10) make(chan int) |
make用的比较多,new一般不用,因为可以被 &T{} 形式替代,而且&T{} 还可以对初始化成员域的值
网友评论