了解Go 建構子中傳回位址的用法:新建與直接回傳
與提供明確建構子的其他語言不同,Go採用了“新”函數代替構造函數。但是,為什麼 Go 的“New”函數中通常會傳回位址(&f),而不是直接傳回 File 物件?
位址和直接回傳之間的區別
Go 的語法允許回傳值(非指針)或指針,將決定權留給開發人員。通常,當值作為 1 更有用時,會傳回指標。如果傳回值:
1,則尤其如此。具有具有指標接收器的多個方法:
返回指標允許直接在返回的物件上連結方法調用,即使這些方法採用指標接收器也是如此。這樣就無需將返回值儲存在變數中並手動呼叫方法。
2.儲存在不可尋址的資料結構中:
某些資料結構(例如映射)不支援直接定址值。傳回指標可以規避此限制,允許對資料結構中儲存的值進行方法呼叫。
3.是否是經常傳遞的大型結構體:
指針對於大量傳遞的大型結構體是有利的,因為它可以優化記憶體使用和效能。
範例比較:
考慮一個帶有採用指標的方法的簡單結構接收者:
type My int func (m *My) Str() string { return strconv.Itoa(int(*m)) } func createMy(i int) My { return My(i) } // Direct return func createMyPtr(i int) *My { return (*My)(&i) } // Address return
嘗試使用直接回傳值時:
fmt.Println(createMy(12).Str())
發生錯誤:「無法在createMy(12)上呼叫指標方法」。然而,隨著位址返回:
fmt.Println(createMyPtr(12).Str())
方法呼叫成功,沒有錯誤。
結論:
是否返回a的決定直接在 Go 的「New」函數中使用指標或值取決於返回物件的預期用途。在處理具有指標接收器的方法、不可尋址的資料結構或頻繁傳遞的大型結構時,指標具有優勢。
以上是為什麼在 Go 的'新”函數中返回指標而不是值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!