go基础-make和new的区别

135 阅读1分钟

区别

1、new(T) 返回的是 T 的指针 new(T) 为一个 T 类型新值分配空间并将此空间初始化为 T 的零值,返回的是新值的地址,也就是 T 类型的指针 *T,该指针指向 T 的新分配的零值。(nil并不是空) 2、make 只能用于 slice,map,channel,make返回结果本身就是指针(引用可以看成特殊的指针)make(T, args) 返回的是初始化之后的 T 类型的值,这个新值并不是 T 类型的零值,也不是指针 *T,是经过初始化之后的 T 的引用

slice

func main() {
   var s1 [] int
    s2 :=make([] int,0)
    s3 :=*new([] int)
   // slice
   rs1 := (*reflect.SliceHeader)(unsafe.Pointer(&s1))
   rs2 := (*reflect.SliceHeader)(unsafe.Pointer(&s2))
   rs3 := (*reflect.SliceHeader)(unsafe.Pointer(&s3))
   fmt.Printf("addr:%d, len:%d, cap:%d\n", rs1.Data, rs1.Len,rs1.Cap)
   fmt.Printf("addr:%d, len:%d, cap:%d\n", rs2.Data, rs2.Len,rs2.Cap)
   fmt.Printf("addr:%d, len:%d, cap:%d\n", rs3.Data, rs3.Len,rs3.Cap)
   /*
      addr:0, len:0, cap:0
      addr:824634597000, len:0, cap:0
      addr:0, len:0, cap:0
   */
}

map