2 回答

TA貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊
您不能new
像代碼示例中那樣使用切片和地圖,而必須使用以下make
命令:make([]float, 100)
兩者new(MyStruct)
和&MyStruct{}
都執(zhí)行相同的操作,因?yàn)槿绻褂茫Λ@得它們的地址,Go將在堆上分配值。有時(shí),代碼只是以一種或另一種方式更好地表達(dá)了其意圖。
Go沒有對構(gòu)造函數(shù)的內(nèi)置支持,因此通常您會(huì)將調(diào)用包裝new
到一個(gè)函數(shù)中,例如NewMyStruct()
,它將執(zhí)行所有必要的初始化。它還可以初始化私有字段或?qū)⒔Y(jié)構(gòu)隱藏在接口后面,以防止對象的用戶直接破壞其內(nèi)部。當(dāng)您在添加/刪除/重新命名/重新排序字段時(shí)不需要更改所有用戶時(shí),通過這種方式還可以更輕松地演化結(jié)構(gòu)的結(jié)構(gòu)。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超7個(gè)贊
make僅適用于地圖,切片和通道以及復(fù)合文字,例如type{}僅適用于結(jié)構(gòu),數(shù)組,切片和地圖。對于其他類型,您將必須使用new獲取指向新分配實(shí)例的指針(如果您不想使用更長的實(shí)例var v T; f(&v))。
我想如果要初始化一個(gè)結(jié)構(gòu),這很有用:
typedef foo struct {
bar *int
}
v := foo{bar: new(int)}
- 2 回答
- 0 關(guān)注
- 500 瀏覽
添加回答
舉報(bào)