ホームページ > バックエンド開発 > Golang > Go のインターフェイス セッター メソッドにポインターが必要なのはなぜですか?

Go のインターフェイス セッター メソッドにポインターが必要なのはなぜですか?

Barbara Streisand
リリース: 2024-11-23 11:35:26
オリジナル
193 人が閲覧しました

Why Do Go's Interface Setter Methods Require Pointers?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート