ポインター レシーバーを使用した Golang メソッド
メソッドを通じてインスタンスの値を変更しようとする場合、ポインターの概念を理解することが重要です受信機。この例では、レシーバーがポインター型ではないため、SetSomeField メソッドが期待どおりに動作しません。
これを修正するには、次のようにポインター レシーバーを受け入れるように SetSomeField メソッドを変更します。
func (i *Implementation) SetSomeField(newValue string) { ... }
ただし、この変更により新たな問題が発生します。GetSomeField メソッドにはまだ値があるため、構造体はインターフェイスを実装しなくなりました。解決策は、インターフェイスの実装時に構造体へのポインタを使用することです。そうすることで、メソッドがコピーを作成せずに実際のインスタンスを変更できるようになります。変更されたコードは次のとおりです。
この更新されたコードでは、Create 関数は IFace インターフェイスを実装する実装構造体へのポインターを返します。その結果、IFace 型の変数は実装構造体へのポインターを参照でき、SetSomeField メソッドでその値を変更できるようになります。type IFace interface { SetSomeField(newValue string) GetSomeField() string } type Implementation struct { someField string } func (i *Implementation) GetSomeField() string { return i.someField } func (i *Implementation) SetSomeField(newValue string) { i.someField = newValue } func Create() *Implementation { return &Implementation{someField: "Hello"} } func main() { var a IFace a = Create() a.SetSomeField("World") fmt.Println(a.GetSomeField()) }
以上がポインター レシーバーを使用しない限り、Go メソッドでインスタンス値が変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。