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

8

请问有人能解释一下这两种符号之间微妙的区别:(*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) 和其他的不同之处在于它返回空指针或无指针,但仍为结构体的所有字段分配内存。
1个回答

13
两种形式的new(T)&T{}是完全等价的:它们都分配了一个零值的T并返回指向该分配内存的指针。唯一的区别是&T{}不能用于像int这样的内置类型;您只能使用new(int)
形式(*T)(nil)不会分配一个T,它只是返回一个指向T的空指针。你的test3 := (*Struct)(nil)只是惯用的var test3 *Struct的混淆变体。

如果 (*T)(nil) 不分配内存,那我为什么可以访问它的结构体字段?unsafe 显示的值与使用 new(T) 相同。 - Timur Fayzrakhmanov
6
您没有权限访问。 - Volker
是的,你说得对!那是自动完成。抱歉我问了这么多问题,但如果是这样,为什么空指针仍然占用字节呢? - Timur Fayzrakhmanov
2
“empty pointer still takes bytes”是什么意思?指针本身需要空间(通常为8个字节)来存储,但它指向的位置不存在:没有为指针可能指向的结构体分配内存。 - Volker
谢谢,我已经听到我想要的了。 - Timur Fayzrakhmanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接