go语言中make和new的区别
make和new都是在堆上申请内存,但是make只用于复合类型(slice、map和channel)的的初始化,并且将内存置成该类型对应的零值。new用于类型的内存分配,并且将内存置为nil。而且make返回的是引用类型的本身,new返回的是指向类型的指针。所以make既分配内存也会进行初始化,new只是分配内存但并不进行初始化(nil值)。
下面展示一些 内联代码片
。
// 使用make来初始化一个map
mv := make(map[string]string)
fmt.Printf("mv: %p %#v\n", &mv, mv)
//使用new来初始化一个map
nv := new(map[string]string)
fmt.Printf("nv: %p %#v\n", &nv, nv)
// 看看返回结果
mv: 0xc000012030 map[string]string{} //&mv返回的是变量的地址,mv返回的是变量的引用,并且map的值被置成空接口
nv: 0xc000012040 &map[string]string(nil) //&nv返回的是变量的地址,nv返回的是变量的指针,并且map的值被置成空
如果我们考虑使用这两种方式生成出来的map,方法也会有一些不一样,如下:
// 使用make来初始化一个map
mv := make(map[string]string)
fmt.Printf("mv: %p %#v\n", &mv, mv)
// 直接使用mv,增加一个键值对
mv["key"] = "value"
//使用new来初始化一个map
nv := new(map[string]string)
fmt.Printf("nv: %p %#v\n", &nv, nv)
//编译的时候报错,因为不能索引一个指针变量
nv["key"] = "value"
//运行时错误,不能对一个nil的map进行赋值
(*nv)["key"] = "value"