【问题标题】:What the difference between (*T)(nil) and &T{}/new(T)? Golang(*T)(nil) 和 &T{}/new(T) 有什么区别?戈朗
【发布时间】:2015-01-07 20:14:24
【问题描述】:

谁能解释这两个符号之间的细微差别:(*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指针或不返回指针,但仍然为Struct的所有字段分配内存。

【问题讨论】:

    标签: memory memory-management syntax go


    【解决方案1】:

    new(T)&T{} 这两种形式是完全等价的:两者都分配一个零 T 并返回一个指向该分配内存的指针。唯一的区别是,&T{} 不适用于像 int 这样的内置类型;你只能new(int)

    (*T)(nil) 的形式分配了一个 T,它只是返回一个指向 T 的 nil 指针。您的 test3 := (*Struct)(nil) 只是惯用 var test3 *Struct 的混淆变体。

    【讨论】:

    • 如果(*T)(nil) 不分配内存,为什么我可以访问其结构的字段? unsafe 显示的值与我只使用 new(T) 相同
    • 你没有访问权限。
    • 是的,你是对的!这是自动完成)对不起我的菜鸟问题,但如果是这样,为什么空指针仍然需要字节?
    • “空指针仍然占用字节”是什么意思?指针本身需要存储空间(通常为 8 个字节),但它不指向任何地方:没有为指针可能指向的结构分配 RAM。
    • 谢谢你,我听到了我想要的)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多