首頁  >  文章  >  後端開發  >  你能在 Go 中創建不可變結構嗎?

你能在 Go 中創建不可變結構嗎?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-12 03:32:021012瀏覽

Can You Create Immutable Structs in Go?

Go 中的不可變結構體

問題: 在Go 中建立一個不可變結構體是否可行,確保一旦初始化後,只能對其欄位執行讀取操作而不修改其值?如果是這樣,如何實現?

答案:

在 Go 中,結構體本質上是可變的。但是,可以透過採用某些技術使結構在其包之外只讀。實作方法如下:

定義不可變結構:

定義具有非匯出欄位(以小寫字母開頭的欄位)的結構。這可以防止從套件外部直接存取欄位。

package mypackage

type myReadOnly struct {
  value int
}

提供讀取器函數:

建立可以存取結構體私有欄位的讀取器函數。這些函數將傳回欄位的副本,確保原始值保持不變。

func (s myReadOnly) Value() int {
  return s.value
}

初始化不可變結構:

建立一個初始化結構的函數並傳回一個實例。此函數用於建立不可變結構的新實例。

func NewMyReadOnly(value int) myReadOnly{
  return myReadOnly{value: value}
}

用法:

若要使用不可變結構,請匯入套件並使用下列指令建立實例初始化函數。使用讀取器函數存取字段。

myReadOnly := mypackage.NewMyReadOnly(3)
fmt.Println(myReadOnly.Value()) // Prints 3

在此範例中,任何修改 myReadOnly 實例的 value 欄位的嘗試都會導致編譯錯誤,因為該欄位未匯出。讀取器函數 Value 提供了一種無需修改欄位即可存取該欄位的方法。這種方法有效地在 Go 中創建了一個不可變的結構。

以上是你能在 Go 中創建不可變結構嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn