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个都不合理。所以这种复合结构的内存分配多数时候会采取的策略就是延迟分配,在需要的时候进行扩