数据:make 和 new 的区别

4-16 make和new的区别

我们知道在Go里面创建引用对象有几种方式。

func makeMap() map[int]int {
    return make(map[int]int)
}

func newMap() map[int]int {
    //new返回的是一个指针,我们取指针的值
    return *new(map[int]int)
}

func main() {
    m1 := makeMap() // m1(*hmap) -> heap(hmap)
    m2 := newMap()  // m2(*hmap) -> 00 00 00 00

    fmt.Println(m1, m2)

    m1[1] = 100
    m2[1] = 100 //nil map?

    p1 := (*uintptr)(unsafe.Pointer(&m1))
    p2 := (*uintptr)(unsafe.Pointer(&m2))

    fmt.Println("%x, %x\n", *p1, *p2)
}

这两种到底有什么不同,就字典来说在行为上有什么不同。

任何复合结构的内存都是延迟分配的,也就是当你往里面赋值的时候才去分配。make和new都不会对key、value提前分配内存,除非指定容量。首先hash表在没有往里面添加东西的时候我们怎么知道分配多大合适,也许对方只分配6个keyValue对,分配100个都不合理。所以这种复合结构的内存分配多数时候会采取的策略就是延迟分配,在需要的时候进行扩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值