web-dev-qa-db-ja.com

Golangの不変の構造体

Golangで不変の構造体を定義することは可能ですか?初期化すると、構造体のフィールドの読み取り操作のみが行われ、フィールド値の変更は行われません。もしそうなら、それを行う方法。

構造体のメンバーを非エクスポートにし、リーダーを提供することにより、パッケージ外で構造体を読み取り専用にすることができます。例えば:

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.NewMyReaonly(3)
fmt.Println(myReadonly.Value())  // Prints 3
29

一般的な方法でフィールド/変数を読み取り専用としてマークする方法はありません。できることは、フィールド/変数を未エクスポート(最初の文字は小さい)としてマークし、他のパッケージが変数を編集するのを防ぐためのパブリックゲッターを提供することだけです。

2