ホームページ >バックエンド開発 >Golang >Go インターフェイスが Setter メソッドを直接サポートできない理由と、これを回避するにはどうすればよいですか?

Go インターフェイスが Setter メソッドを直接サポートできない理由と、これを回避するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-25 00:50:14296ブラウズ

Why Can't Go Interfaces Directly Support Setter Methods, and How Can This Be Worked Around?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。