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

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

Susan Sarandon
リリース: 2024-11-19 15:02:02
オリジナル
967 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート