(*T)(零)和&T {}/new(T)之间有什么区别?Golang

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.

  • 您无权访问. (6认同)
  • "空指针仍占用字节"是什么意思?指针本身需要存储空间(通常为8个字节),但它指向无处:没有为指针指向的结构分配RAM. (2认同)