Go のポリモーフィズム: インターフェイス メソッドとポインター レシーバーの詳細
Go では、ポリモーフィズムはネイティブにサポートされていませんが、サポートされる可能性があります。インターフェースを使用して実現されます。これにより、一般的な質問が生じます: なぜセッター メソッドがインターフェイスで許可されないのですか?
提供されたコードで示されているように、セッター メソッドが値レシーバーとして定義されている場合、関数内で行われた変更は終了時に失われます。 。レシーバーをポインター レシーバーに変更すると、永続的な変更が可能になりますが、コンパイル エラーが発生します。
これに対処するために、Go は回避策を提供します。修正されたコードは、setter メソッドのレシーバーをポインターに変更します。これにより、関数が基礎となるデータ構造を変更し、変更を保持できるようになります。変更されたコードはインターフェイスを使用し、インターフェイスを介してポインター レシーバー メソッドにアクセスできるようにします。
package main import "fmt" type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this *MyStruct) Get() int { return this.data } func (this *MyStruct) Set(i int) { this.data = i } func main() { s := &MyStruct{123} fmt.Println(s.Get()) s.Set(456) fmt.Println(s.Get()) var mi MyInterfacer = s mi.Set(789) fmt.Println(mi.Get()) }
これは厳密にはポリモーフィズムではありませんが、インターフェイスとポインター レシーバーを使用することで効果的に同様の結果を達成します。このコードを使用すると、インターフェースを通じてプロパティを設定し、データと操作をきれいにカプセル化できます。
以上がGo インターフェイスが Setter メソッドを直接サポートできない理由と、これを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。