Memory (*T)(nil)和&;T{}/新(T)?戈兰尼

Memory (*T)(nil)和&;T{}/新(T)?戈兰尼,memory,memory-management,syntax,go,Memory,Memory Management,Syntax,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.Struc

谁能解释一下这两种符号之间的细微差别:
(*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指针或无指针,但仍然为结构的所有字段分配内存。

这两种形式
new(T)
&T{/code>是完全等效的:都分配一个零T,并返回一个指向这个分配内存的指针。唯一的区别是,
&T{}
不适用于内置类型,如
int
;您只能执行
new(int)


表单
(*T)(nil)
没有分配
T
它只是返回一个指向T的nil指针。您的
test3:=(*Struct)(nil)
只是惯用的
var test3*Struct
的一个模糊变体,如果
(*T)(nil)
没有分配内存,为什么我可以访问它的结构字段<代码>不安全
显示相同的值,就好像我只使用了新的(T)而您没有访问权限一样。是的,您是对的!这是自动完成)对不起我的noob问题,但如果是这样,为什么空指针仍然需要字节?你说“空指针仍然需要字节”是什么意思?指针本身需要存储空间(通常为8字节),但它不指向任何地方:没有为指针可能指向的结构分配RAM。谢谢,我已经听到了我想要的内容)