在原始语言构造中使用它似乎毫无意义,因为您无法指定任何类型的值func main() { y := new([]float) fmt.Printf("Len = %d", len(*y) ) // => Len = 0}对于stucts它使一个有点更有意义,但有什么说的区别y := new(my_stuct)和看似更简洁y := &my_struct?并且由于您创建的任何内容都是基于这些原语的,因此它们将被初始化为所述零值。那有什么意义呢?您什么时候想使用new()?对初学者的问题很抱歉,但是文档并不总是那么清晰。
2 回答
富国沪深
TA贡献1790条经验 获得超9个赞
您不能new
像代码示例中那样使用切片和地图,而必须使用以下make
命令:make([]float, 100)
两者new(MyStruct)
和&MyStruct{}
都执行相同的操作,因为如果使用&获得它们的地址,Go将在堆上分配值。有时,代码只是以一种或另一种方式更好地表达了其意图。
Go没有对构造函数的内置支持,因此通常您会将调用包装new
到一个函数中,例如NewMyStruct()
,它将执行所有必要的初始化。它还可以初始化私有字段或将结构隐藏在接口后面,以防止对象的用户直接破坏其内部。当您在添加/删除/重新命名/重新排序字段时不需要更改所有用户时,通过这种方式还可以更轻松地演化结构的结构。
qq_笑_17
TA贡献1818条经验 获得超7个赞
make仅适用于地图,切片和通道以及复合文字,例如type{}仅适用于结构,数组,切片和地图。对于其他类型,您将必须使用new获取指向新分配实例的指针(如果您不想使用更长的实例var v T; f(&v))。
我想如果要初始化一个结构,这很有用:
typedef foo struct {
bar *int
}
v := foo{bar: new(int)}
- 2 回答
- 0 关注
- 467 浏览
添加回答
举报
0/150
提交
取消