ホームページ >バックエンド開発 >Golang >ポインター レシーバーを使用しない限り、Go メソッドでインスタンス値が変更されないのはなぜですか?

ポインター レシーバーを使用しない限り、Go メソッドでインスタンス値が変更されないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-08 22:11:12296ブラウズ

Why Doesn't My Go Method Modify the Instance Value Unless I Use a Pointer Receiver?

ポインター レシーバーを使用した Golang メソッド

メソッドを通じてインスタンスの値を変更しようとする場合、ポインターの概念を理解することが重要です受信機。この例では、レシーバーがポインター型ではないため、SetSomeField メソッドが期待どおりに動作しません。

これを修正するには、次のようにポインター レシーバーを受け入れるように SetSomeField メソッドを変更します。

func (i *Implementation) SetSomeField(newValue string) {
    ...
}

ただし、この変更により新たな問題が発生します。GetSomeField メソッドにはまだ値があるため、構造体はインターフェイスを実装しなくなりました。解決策は、インターフェイスの実装時に構造体へのポインタを使用することです。そうすることで、メソッドがコピーを作成せずに実際のインスタンスを変更できるようになります。変更されたコードは次のとおりです。

この更新されたコードでは、Create 関数は IFace インターフェイスを実装する実装構造体へのポインターを返します。その結果、IFace 型の変数は実装構造体へのポインターを参照でき、SetSomeField メソッドでその値を変更できるようになります。
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())
}

以上がポインター レシーバーを使用しない限り、Go メソッドでインスタンス値が変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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