区别
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
*/
}