3 回答

TA貢獻(xiàn)1836條經(jīng)驗 獲得超13個贊
Go有多種內(nèi)存分配和值初始化方式:
&T{...},&someLocalVar,new,make
創(chuàng)建復(fù)合文字時也可能發(fā)生分配。
new可以用來分配整數(shù)等值,&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可以看到和之間的區(qū)別:
p := new(chan int) // p has type: *chan int
c := make(chan int) // c has type: chan int
假設(shè)Go沒有newand make,但是它具有內(nèi)置功能NEW。然后,示例代碼將如下所示:
p := NEW(*chan int) // * is mandatory
c := NEW(chan int)
這* 將是強(qiáng)制性的,因此:
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成一個單一的內(nèi)置功能是可能的。但是,與具有兩個內(nèi)置函數(shù)相比,單個內(nèi)置函數(shù)可能會在新的Go程序員中引起更多的混亂。
考慮到以上所有方面,似乎更適合new并將make其分開。

TA貢獻(xiàn)1799條經(jīng)驗 獲得超9個贊
您可以做的事情make
是您無法做的其他任何事情:
建立頻道
創(chuàng)建一個預(yù)先分配了空間的地圖
創(chuàng)建具有預(yù)分配空間或len!= cap的切片
證明有一點困難new
。使它變得更容易的主要事情是創(chuàng)建指向非復(fù)合類型的指針。以下兩個功能是等效的。簡而言之:
func newInt1() *int { return new(int) }
func newInt2() *int {
var i int
return &i
}

TA貢獻(xiàn)1779條經(jīng)驗 獲得超6個贊
make
函數(shù)僅分配和初始化slice,map或chan類型的對象。像一樣new
,第一個參數(shù)是一個類型。但是,它也可能需要第二個參數(shù),即大小。與new不同,make的返回類型與其參數(shù)的類型相同,而不是指向它的指針。并且分配的值被初始化(不像new那樣設(shè)置為零值)。原因是slice,map和chan是數(shù)據(jù)結(jié)構(gòu)。它們需要初始化,否則將無法使用。這就是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 關(guān)注
- 288 瀏覽
添加回答
舉報