我为什么要 make() 或 new()?

新手上路,请多包涵

介绍文档用很多段落来解释 new()make() 之间的区别,但实际上,您可以在本地范围内创建对象并返回它们。

为什么要使用这对分配器?

原文由 slezica 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 573
2 个回答

Go有多种内存分配和值初始化的方式:

&T{...} , &someLocalVar , new , make

创建复合文字时也可能发生分配。


new 可用于分配整数等值, &int 是非法的:

 new(Point)
&Point{}      // OK
&Point{2, 3}  // Combines allocation and initialization

new(int)
&int          // Illegal

// Works, but it is less convenient to write than new(int)
var i int
&i

newmake 之间的区别可以通过查看以下示例看出:

 p := new(chan int)   // p has type: *chan int
c := make(chan int)  // c has type: chan int

假设 Go 没有 newmake ,但它有内置函数 NEW 。那么示例代码将如下所示:

 p := NEW(*chan int)  // * is mandatory
c := NEW(chan int)

* 是强制性 的,所以:

 new(int)        -->  NEW(*int)
new(Point)      -->  NEW(*Point)
new(chan int)   -->  NEW(*chan int)
make([]int, 10) -->  NEW([]int, 10)

make(Point)  // Illegal
make(int)    // Illegal

是的,将 newmake 合并到一个内置函数中是可能的。然而,与拥有两个内置函数相比,单个内置函数可能会在新 Go 程序员中引起更多的混淆。

考虑到以上所有几点, newmake 保持独立似乎更合适。

原文由 user811773 发布,翻译遵循 CC BY-SA 4.0 许可协议

你可以用 make 做的事情,你不能做任何其他方式:

  • 创建频道
  • 创建一个预分配空间的地图
  • 创建一个带有预分配空间或带有 len != cap 的切片

证明 new 。它使更容易的主要事情是创建指向非复合类型的指针。下面两个函数是等价的。一个更简洁一点:

 func newInt1() *int { return new(int) }

func newInt2() *int {
    var i int
    return &i
}

原文由 Evan Shaw 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题