首頁 > 後端開發 > Golang > 為什麼在 Go 的'新”函數中返回指標而不是值?

為什麼在 Go 的'新”函數中返回指標而不是值?

Susan Sarandon
發布: 2024-12-24 02:30:11
原創
543 人瀏覽過

Why Return a Pointer Instead of a Value in Go's

了解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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板