为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
jeck猫 2021-04-01 14:15:58
在原始语言构造中使用它似乎毫无意义,因为您无法指定任何类型的值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(),它将执行所有必要的初始化。它还可以初始化私有字段或将结构隐藏在接口后面,以防止对象的用户直接破坏其内部。当您在添加/删除/重新命名/重新排序字段时不需要更改所有用户时,通过这种方式还可以更轻松地演化结构的结构。


查看完整回答
反对 回复 2021-04-26
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

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


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


typedef foo struct {

    bar *int

}

v := foo{bar: new(int)}


查看完整回答
反对 回复 2021-04-26
  • 2 回答
  • 0 关注
  • 429 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信