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。谢谢,我已经听到了我想要的内容)