go语言中的make和new的区别

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"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值