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

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


func main() {

    y := new([]float)

    fmt.Printf("Len = %d", len(*y) ) // => Len = 0

}

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


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


对初学者的问题很抱歉,但是文档并不总是那么清晰。


jeck猫
浏览 434回答 2
2回答

富国沪深

您不能new像代码示例中那样使用切片和地图,而必须使用以下make命令:make([]float, 100)两者new(MyStruct)和&MyStruct{}都执行相同的操作,因为如果使用&获得它们的地址,Go将在堆上分配值。有时,代码只是以一种或另一种方式更好地表达了其意图。Go没有对构造函数的内置支持,因此通常您会将调用包装new到一个函数中,例如NewMyStruct(),它将执行所有必要的初始化。它还可以初始化私有字段或将结构隐藏在接口后面,以防止对象的用户直接破坏其内部。当您在添加/删除/重新命名/重新排序字段时不需要更改所有用户时,通过这种方式还可以更轻松地演化结构的结构。

qq_笑_17

make仅适用于地图,切片和通道以及复合文字,例如type{}仅适用于结构,数组,切片和地图。对于其他类型,您将必须使用new获取指向新分配实例的指针(如果您不想使用更长的实例var v T; f(&v))。我想如果要初始化一个结构,这很有用:typedef foo struct {    bar *int}v := foo{bar: new(int)}
打开App,查看更多内容
随时随地看视频慕课网APP