有人可以解释这两种表示法之间的细微差别:(*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)
与其他的唯一区别在于它返回nil指针或没有指针,但仍然为Struct的所有字段分配内存。
答案 0 :(得分:10)
两种形式new(T)
和&T{}
完全等效:两者都分配零T并返回指向此分配内存的指针。唯一的区别是,&T{}
对int
等内置类型不起作用;你只能做new(int)
。
表单(*T)(nil)
执行不分配T
它只返回指向T的nil指针。您的test3 := (*Struct)(nil)
只是惯用语的混淆变体{ {1}}。