Go におけるポリモーフィズム: インターフェイスの実装
Go は従来のポリモーフィズムをサポートしていませんが、インターフェイスは同様の効果を達成する手段を提供します。ただし、setter メソッドの実装には制限が存在します。
問題
次のコードを考えてみましょう:
type MyInterfacer interface { Get() int Set(i int) } type MyStruct struct { data int } func (this MyStruct) Get() int { return this.data }
Set メソッドの結果を実装しようとしましたでエラー:
func (this MyStruct) Set(i int) { this.data = i }
解決策
この制限を回避するには、Set メソッドのレシーバーは次のようにポインターである必要があります。
func (this *MyStruct) Set(i int) { this.data = i }
これにより、メソッドが基になるデータを変更できるようになり、インターフェースに反映されます。 variable.
修正されたコード
次の修正されたコードは意図したとおりに動作します:
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 でのインターフェイス実装による柔軟性のレベル。
以上がGo のインターフェイス セッター メソッドにポインターが必要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。