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

Aar*_*ken 4 go

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

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

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

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

对于非常初学者的问题感到抱歉,但文档并不总是那么清楚.

Esk*_*ola 5

您不能new像在代码示例中那样使用切片和贴图,而是必须使用以下make命令:make([]float, 100)

双方new(MyStruct)&MyStruct{}做同样的事情,因为Go会在堆上,如果你有和得到他们的地址分配的值.有时,代码只是在一种风格或另一种风格中表达它的意图.

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

  • 不,你*可以*在切片和地图类型上使用`new`.`new`初始化指​​向该类型的零值的内存(所有类型都具有零值),对于切片和映射,它是"nil".因此,切片或地图类型上的"new"只会创建一个指向"nil"的指针.`x:= new([] float)`与`var temp [] float相同; x:=&temp` (5认同)
  • 轻微修正.如果指针转义函数,Go将在堆上进行分配.它通过执行转义分析和适当分配来实现.仅使用new或&运算符不足以导致在堆上分配值 (2认同)