什么时候应该在Go中使用`new`?

时间:2010-06-27 22:06:29

标签: go

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

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

对于stucts,它使更有意义,但说y := new(my_stuct)和看似更简洁y := &my_struct之间的区别是什么?

由于您创建的任何内容都基于这些基元,因此它们将初始化为所述零值。那有什么意义呢?您何时想要使用new()

很抱歉这个非常初学的问题,但文档并不总是很清楚。

2 个答案:

答案 0 :(得分:5)

您不能像在代码示例中那样使用new作为切片和地图,而是必须使用make commandmake([]float, 100)

new(MyStruct)&MyStruct{}都做同样的事情,因为如果你用&获取地址,Go会在堆上分配值。有时,代码只是在一种风格或另一种风格中更好地表达它。

Go没有内置的构造函数支持,所以通常你会将对new的调用包装成一个函数,例如NewMyStruct(),它会完成所有必要的初始化。它还可以初始化私有字段或隐藏接口后面的结构,以防止对象的用户直接搞乱其内部。当你在添加/删除/重命名/重新排序字段时不需要更改所有用户时,也可以更容易地改进结构的结构。

答案 1 :(得分:0)

make仅适用于地图,切片和通道,而type{}等复合文字仅适用于结构,数组,切片和贴图。对于其他类型,您必须使用new来获取指向新分配实例的指针(如果您不想使用更长的var v T; f(&v))。

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

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