ホームページ >バックエンド開発 >Golang >Go インターフェイスの値レシーバーとポインター レシーバー: インターフェイスの割り当てが失敗するのはどのような場合ですか?

Go インターフェイスの値レシーバーとポインター レシーバー: インターフェイスの割り当てが失敗するのはどのような場合ですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-19 15:02:02970ブラウズ

Value vs. Pointer Receivers in Go Interfaces: When Does Interface Assignment Fail?

Go の構造メソッドとインターフェイスの実装を理解する

Go では、インターフェイスを満たすメソッドは 2 つのタイプに分類できます。 値レシーバーを持つメソッドポインターレシーバーを使用するメソッド。ただし、インターフェイスを実装する場合、インターフェイスへの値の割り当て可能性は、構造体メソッドの直接呼び出しとは異なります。

提供されたコード スニペットを検討してください。

type greeter interface {
    hello()
    goodbye()
}

グリーター インターフェイスは、hello と 2 つのメソッドを定義します。さようなら。

type tourGuide struct {
    name string
}

tourGuide 構造体はグリーターを実装します。

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

メソッド hello には値レシーバーがあり、これにより、tourGuide 型の変数を使用して直接メソッドを呼び出すことができます。一方、

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

メソッド Goodby には、ポインター レシーバー。呼び出すにはポインター変数が必要です。

次に、インターフェイスを調べてみましょう。実装:

var g2 greeter = t2
g2.hello()   // Hello Smith
g2.goodbye() // Goodbye Smith

*tourGuide 型のポインター変数 t2 をインターフェイス型グリーターのレシーバー値に代入することは成功します。これは、ポインター レシーバーによって値のアドレスの取得が可能になり、そのアドレスがレシーバーとして使用されるためです。

var g1 greeter = t1

ただし、tourGuide 型の非ポインタ変数 t1 をインターフェイス型greeter のレシーバ値に割り当てると、失敗します。これは、ポインター レシーバーを持つメソッドにはポインター レシーバーが必要であり、値自体をポインターとして直接使用することはできないためです。

要約すると、値レシーバーを持つメソッドは、値またはポインターのいずれかを使用して呼び出すことができます。一方、ポインター レシーバーを持つメソッドは、ポインターを使用してのみ呼び出すことができます。ポインター レシーバーを持つメソッドを使用してインターフェイスを実装する場合、基礎となる型としてポインターを使用することが重要です。

以上がGo インターフェイスの値レシーバーとポインター レシーバー: インターフェイスの割り当てが失敗するのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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