(*T)(nil) 和 &T{}/new(T) 有什么区别?戈朗

What the difference between (*T)(nil) and &T{}/new(T)? Golang

谁能解释一下这两个符号之间的细微差别:(*T)(nil)/new(T)&T{}

type Struct struct {
    Field int
}

func main() {
    test1 := &Struct{}
    test2 := new(Struct)
    test3 := (*Struct)(nil)
    fmt.Printf("%#v, %#v, %#v \n", test1, test2, test3)
    //&main.Struct{Field:0}, &main.Struct{Field:0}, (*main.Struct)(nil) 
}

似乎这个 (*T)(nil) 与其他的唯一区别是它 returns 没有指针或没有指针,但仍然为 Struct 的所有字段分配内存。

new(T)&T{}这两种形式是完全等价的:都分配一个零T和return指向这个分配内存的指针。唯一的区别是,&T{} 不适用于像 int 这样的内置类型;你只能做 new(int).

形式 (*T)(nil) 分配一个 T 它只是 return 一个指向 T 的 nil 指针。你的 test3 := (*Struct)(nil)只是惯用语 var test3 *Struct.

的混淆变体