Go のインターフェイスのポインター レシーバー
Go でメソッド レシーバーを使用する場合、ポインター型のレシーバーにより、メソッドが実際のインターフェイスを変更できるようになります。レシーバーのインスタンス値。指定されたコードには、GetSomeField と SetSomeField という 2 つのメソッドを備えた IFace インターフェイスがあります。実装構造体は IFace を実装し、値レシーバーを持つメソッドを持っています。つまり、インスタンスのコピーを操作します。
動作を強化するには、SetSomeField のメソッド レシーバーをポインター型に変更する必要があります。実際のインスタンスを操作できます。ただし、これにより、SetSomeField メソッドにポインター レシーバーがあるため、実装で IFace を実装できないというコンパイル エラーが発生します。
解決策は、構造体へのポインターがインターフェイスを実装するようにすることです。こうすることで、コピーを作成せずに実際のインスタンスのフィールドを変更できます。変更されたコードは次のとおりです。
package main import ( "fmt" ) 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()) }
この変更により、実装へのポインタが IFace を実装できるようになり、コピーを作成せずに実際のインスタンスを変更できるようになります。
以上が基礎となるインスタンス値を変更するときに、ポインター レシーバーは Go インターフェイスの実装の問題をどのように解決できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。