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

谁能解释一下这两个符号之间的细微差别:(*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 的所有字段分配内存。


慕容森
浏览 206回答 1
1回答

繁华开满天机

两种形式new(T)和&T{}完全等价:都分配一个零 T 并返回一个指向此分配内存的指针。唯一的区别是,这&T{}不适用于诸如int; 之类的内置类型。你只能这样做new(int)。该表格(*T)(nil)并没有分配T它只是返回一个零指针T.你test3 := (*Struct)(nil)仅仅是一个混淆的惯用的变种var test3 *Struct。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go