Go では、インターフェイスのすべてのメソッドを実装している場合、構造体はインターフェイスを実装します。ただし、構造体メソッドにインターフェイスを実装するパラメーターがある場合、構造体はインターフェイスを実装しません。
package main 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) { c := new(C) return c, nil } func test(b B) { } func main() { d := new(D) test(d) }
上記の例では、構造体 D はインターフェイス B を実装しません。 D には、インターフェイス A を実装するパラメータがあります。表示されるエラー メッセージは次のとおりです。
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)
このエラーを修正するには、Connect のパラメータのタイプを変更する必要があります。 D のメソッドを A に変換します。
type D struct { } func (d *D) Connect() (A, error) { c := new(C) return c, nil }
これで、構造体 D はインターフェイス B を実装し、D 値を引数として test() 関数を呼び出すことができるようになります。
以上がメソッドパラメータがインターフェイスを実装する場合、Go 構造体はそのインターフェイスを実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。