考慮以下示例:
type House struct{}
func main() {
house1 := new(House)
house2 := &House{}
fmt.Printf("%T | %T\n", house1, house2)
}
輸出: *main.House | *main.House
兩個賦值都產生一個指向型別的指標House(來自包 main)。
來自 go 檔案new:
// The new built-in function allocates memory. The first argument is a type,
// not a value, and the value returned is a pointer to a newly
// allocated zero value of that type.
兩個作業中的記憶體分配在技術上是否相同?有最佳實踐嗎?
uj5u.com熱心網友回復:
兩個作業中的記憶體分配在技術上是否相同?
我不打算談論實作細節,因為這些可能會也可能不會改變。
從語言規范的角度來看,是有區別的。
與分配new(T)如下規則分配(我自己的筆記在[斜體]):
內置函式
new接受一個 typeT,在運行時為該型別的變數分配存盤空間,并回傳一個*T指向它的 type 值。變數按照初始值部分中的描述進行初始化。[它的零值]
&T{}按照復合文字和尋址的規則使用復合文字進行分配:
復合文字為結構體、陣列、切片和映射構造值,并在每次評估它們時創建一個新值。
獲取復合文字的地址會生成一個指向使用文字值初始化的唯一變數的指標。
因此,new(T)和 都&T{}分配了型別的存盤和產量值*T。然而:
new(T)接受任何型別,包括預先宣告的識別符號為intandbool,如果您只需要使用單行初始化此類變數,這可能會派上用場:
n := new(int) // n is type *int and points to 0
b := new(bool) // b is type *bool and points to false
new(參考 Effective Go)“不會將記憶體初始化為1,它只會將其歸零”。即記憶體位置將具有型別的零值。- 復合文字只能用于結構、陣列、切片和映射
- 復合文字可以通過顯式初始化結構欄位或陣列/切片/映射項來構造非零值
底線:正如 Effective Go 指出的那樣(與上面相同的段落):
如果復合文字根本不包含任何欄位,則它會為該型別創建一個零值。運算式
new(T)和&T{}是等價的。
[1]:規范和 Effective Go 中“初始化”一詞的使用不一致。結論是,new你只能產生一個零值,而復合文字允許你構造非零值。顯然,規格是事實的來源。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/343539.html
標籤:走
下一篇:延遲函式執行順序
