ホームページ >バックエンド開発 >Golang >基礎となるインスタンス値を変更するときに、ポインター レシーバーは Go インターフェイスの実装の問題をどのように解決できるでしょうか?

基礎となるインスタンス値を変更するときに、ポインター レシーバーは Go インターフェイスの実装の問題をどのように解決できるでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-15 08:44:13685ブラウズ

How Can Pointer Receivers Solve Go Interface Implementation Issues When Modifying Underlying Instance Values?

Go のインターフェイスのポインター レシーバー

Go でメソッド レシーバーを使用する場合、ポインター型のレシーバーにより、メソッドが実際のインターフェイスを変更できるようになります。レシーバーのインスタンス値。指定されたコードには、GetSomeField と SetSomeField という 2 つのメソッドを備えた IFace インターフェイスがあります。実装構造体は IFace を実装し、値レシーバーを持つメソッドを持っています。つまり、インスタンスのコピーを操作します。

動作を強化するには、SetSomeField のメソッド レシーバーをポインター型に変更する必要があります。実際のインスタンスを操作できます。ただし、これにより、SetSomeField メソッドにポインター レシーバーがあるため、実装で IFace を実装できないというコンパイル エラーが発生します。

解決策は、構造体へのポインターがインターフェイスを実装するようにすることです。こうすることで、コピーを作成せずに実際のインスタンスのフィールドを変更できます。変更されたコードは次のとおりです。

package main

import (
    "fmt"
)

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())
}

この変更により、実装へのポインタが IFace を実装できるようになり、コピーを作成せずに実際のインスタンスを変更できるようになります。

以上が基礎となるインスタンス値を変更するときに、ポインター レシーバーは Go インターフェイスの実装の問題をどのように解決できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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