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

简介文档中有很多段落专门介绍了new()和之间的区别make(),但是实际上,您可以在本地范围内创建对象并将其返回。

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


开满天机
浏览 233回答 3
3回答

开心每一天1111

Go有多种内存分配和值初始化方式:&T{...},&someLocalVar,new,make创建复合文字时也可能发生分配。new可以用来分配整数等值,&int是非法的:new(Point)&Point{}      // OK&Point{2, 3}  // Combines allocation and initializationnew(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 intc := make(chan int)  // c has type: chan int假设Go没有newand make,但是它具有内置功能NEW。然后,示例代码将如下所示:p := NEW(*chan int)  // * is mandatoryc := 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)  // Illegalnew(int)    // Illegal是的,合并new和make成一个单一的内置功能是可能的。但是,与具有两个内置函数相比,单个内置函数可能会在新的Go程序员中引起更多的混乱。考虑到以上所有方面,似乎更适合new并将make其分开。

扬帆大鱼

您可以做的事情make是您无法做的其他任何事情:建立频道创建一个预先分配了空间的地图创建具有预分配空间或len!= cap的切片证明有一点困难new。使它变得更容易的主要事情是创建指向非复合类型的指针。以下两个功能是等效的。简而言之:func newInt1() *int { return new(int) }func newInt2() *int {    var i int    return &i}

哆啦的时光机

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
打开App,查看更多内容
随时随地看视频慕课网APP