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

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

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

Go
开满天机 2021-05-03 22:18:53
简介文档中有很多段落专门介绍了new()和之间的区别make(),但是实际上,您可以在本地范围内创建对象并将其返回。为什么要使用一对分配器?
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

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

通过查看以下示例new,make可以看到和之间的区别:


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

c := make(chan int)  // c has type: chan int

假设Go没有newand make,但是它具有内置功能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)


new(Point)  // Illegal

new(int)    // Illegal

是的,合并new和make成一个单一的内置功能是可能的。但是,与具有两个内置函数相比,单个内置函数可能会在新的Go程序员中引起更多的混乱。


考虑到以上所有方面,似乎更适合new并将make其分开。


查看完整回答
反对 回复 2021-05-10
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

您可以做的事情make是您无法做的其他任何事情:

  • 建立频道

  • 创建一个预先分配了空间的地图

  • 创建具有预分配空间或len!= cap的切片

证明有一点困难new。使它变得更容易的主要事情是创建指向非复合类型的指针。以下两个功能是等效的。简而言之:

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


func newInt2() *int {

    var i int

    return &i

}


查看完整回答
反对 回复 2021-05-10
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

make函数仅分配和初始化slice,map或chan类型的对象。像一样new,第一个参数是一个类型。但是,它也可能需要第二个参数,即大小。与new不同,make的返回类型与其参数的类型相同,而不是指向它的指针。并且分配的值被初始化(不像new那样设置为零值)。原因是slice,map和chan是数据结构。它们需要初始化,否则将无法使用。这就是new()和make()需要不同的原因。

以下来自Effective Go的示例非常清楚:

p *[]int = new([]int) // *p = nil, which makes p uselessv []int = make([]int, 100) // creates 
v structure that has pointer to an array, length field, and capacity field. So, v is immediately usable



查看完整回答
反对 回复 2021-05-10
  • 3 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

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