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