代码之家  ›  专栏  ›  技术社区  ›  Aaron Yodaiken Stephen Chung

“new”应该在Go中何时使用?

go
  •  4
  • Aaron Yodaiken Stephen Chung  · 技术社区  · 14 年前

    在原始语言构造中使用它似乎毫无意义,因为您不能指定任何类型的值

    func main() {
        y := new([]float)
        fmt.Printf("Len = %d", len(*y) ) // => Len = 0
    }
    

    一点 更有道理,但说出来有什么区别 y := new(my_stuct) 而且看起来更简洁 y := &my_struct ?

    new() ?

    抱歉,这是一个非常初级的问题,但文档并不总是那么清晰。

    2 回复  |  直到 14 年前
        1
  •  6
  •   Esko Luontola    14 年前

    你不能使用 new 对于切片和贴图,如代码示例中所示,但必须使用 make command make([]float, 100)

    new(MyStruct) &MyStruct{} 做同样的事情,因为如果使用&获取值的地址,Go将在堆上分配值;。有时代码只是用一种或另一种方式更好地表达了它的意图。

    Go没有对构造函数的内置支持,因此通常您会将调用包装到 新的 例如,转换成函数 NewMyStruct() 完成所有必要的初始化。它还可以初始化私有字段或将结构隐藏在接口后面,以防止对象的用户直接破坏其内部结构。另外,当您在添加/删除/重命名/重新排序字段时不需要更改其所有用户时,通过这种方式改进结构的结构也更容易。

        2
  •  0
  •   Christian    12 年前

    make type{} 仅适用于结构、数组、切片和映射。对于其他类型,您必须使用 new 获取指向新分配实例的指针(如果不想使用更长的 var v T; f(&v) ).

    如果你想初始化一个结构,我想这很有用:

    typedef foo struct {
        bar *int
    }
    v := foo{bar: new(int)}