ホームページ  >  記事  >  バックエンド開発  >  ポインター レシーバー メソッドを使用した Go 構造体がインターフェイスを満たすことができないのはなぜですか?

ポインター レシーバー メソッドを使用した Go 構造体がインターフェイスを満たすことができないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-19 17:56:02863ブラウズ

Why Can't a Go Struct with a Pointer Receiver Method Satisfy an Interface?

インターフェイスを満たす Go 構造体メソッドの種類

Go では、構造体はさまざまなレシーバー型 (値またはポインター) を持つメソッドを持つことができます。値レシーバーを持つメソッドは構造体の値またはポインターで呼び出すことができますが、ポインター レシーバーを持つメソッドにはポインター レシーバーが必要です。

次の例を考えてみましょう。

type greeter interface {
    hello()
    goodbye()
}

type tourGuide struct {
    name string
}

func (t tourGuide) hello()    { fmt.Println("Hello", t.name) }
func (t *tourGuide) goodbye() { fmt.Println("Goodbye", t.name) }

値 t1 とポインタ t2 の両方を使用して、tourGuide のメソッドを呼び出すことができます。ただし、インターフェイスを実装する場合、tourGuide 値をグリーター インターフェイス変数に割り当てることはできません。

その理由は、メソッドにポインター レシーバーがある場合、レシーバーとして使用できるのはポインター値のみであるためです。インターフェイス値はラップされた値のコピーであり、アドレス指定できないため、ポインター レシーバーを持つメソッドに渡すことはできません。

この制限により、ポインター レシーバーを介して行われた変更がインターフェイス内のコピーにのみ影響するという潜在的な問題が防止されます。元の値ではありません。

したがって、インターフェイスが値型を受け入れるには、そのすべてのメソッドに値レシーバーが必要です。この例では、goodbye にポインタ レシーバがあるため、tourGuide をgreeter に割り当てることはできません。

以上がポインター レシーバー メソッドを使用した Go 構造体がインターフェイスを満たすことができないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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