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