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 は、フィールドを変更せずにアクセスする方法を提供します。このアプローチは、Go で不変の構造体を効果的に作成します。
以上がGo で不変の構造体を作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。