Tim*_*nov 5 memory syntax memory-management go
任何人都能解释这两种符号之间的细微差别:(*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)
}
Run Code Online (Sandbox Code Playgroud)
看起来这个(*T)(nil)
与另一个的唯一区别是它返回nil指针或没有指针,但仍然为Struct的所有字段分配内存.
Vol*_*ker 11
这两种形式的new(T)
和&T{}
是完全等效的:两个分配零T和一个指针返回到该分配的内存.唯一的区别是,这&T{}
对内置类型不起作用int
; 你只能这样做new(int)
.
该表格(*T)(nil)
并没有分配T
它只是返回一个零指针T.你test3 := (*Struct)(nil)
只是惯用的混淆变种var test3 *Struct
.