Go では、インターフェイスによって、名前、引数、戻り値などのメソッドの構造が決まります。構造体がインターフェイスを実装する場合、インターフェイスによって指定されたメソッド シグネチャに厳密に従う必要があります。
構造体 D とそのメソッド Connect が、次の理由によりインターフェイス B の実装に失敗する例を考えてみましょう。戻り値の不一致:
type A interface { Close() } type B interface { Connect() (A, error) } type C struct { } func (c *C) Close() { } type D struct { } func (d *D) Connect() (*C, error) { // Mismatched function signature compared to interface B's Connect method c := new(C) return c, nil }
この場合、D の Connect は C へのポインターとエラーを返しますが、インターフェイス B は Connect が A の実装を返すことを期待しています。そしてエラー。したがって、このエラーは、構造体 D がインターフェイス B を実装していないことを示しており、メソッド シグネチャ間の位置合わせの重要性を強調しています。
cannot use d (type *D) as type B in argument to test: *D does not implement B (wrong type for Connect method) have Connect() (*C, error) want Connect() (A, error)
この問題を解決するには、構造体の実装内のメソッド シグネチャが一致していることを確認してください。インターフェース内のメソッド宣言。このシナリオでは、D の Connect メソッドを B インターフェイスに準拠するように変更する必要があります。
func (d *D) Connect() (A, error) { c := new(C) return c, nil }
対照的に、構造体実装のメソッド シグネチャがインターフェイスと異なる場合、構造体は
type Equaler interface { Equal(Equaler) bool } type T int func (t T) Equal(u T) bool { // Argument type mismatch return t == u } // does not satisfy Equaler
この例では、インターフェイスを実装するには、Equal の引数の型は、別の型 T ではなく、インターフェイスの型 Equaler と一致する必要があります。正しく。
以上が私の Go 構造体がインターフェイスを実装していないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。