3 回答
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其分开。
TA贡献1799条经验 获得超9个赞
您可以做的事情make
是您无法做的其他任何事情:
建立频道
创建一个预先分配了空间的地图
创建具有预分配空间或len!= cap的切片
证明有一点困难new
。使它变得更容易的主要事情是创建指向非复合类型的指针。以下两个功能是等效的。简而言之:
func newInt1() *int { return new(int) }
func newInt2() *int {
var i int
return &i
}
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
- 3 回答
- 0 关注
- 256 浏览
添加回答
举报