-
开心每一天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