インターフェイスを満たす 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 サイトの他の関連記事を参照してください。