亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我為什么要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 關注
  • 305 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號