Go プログラムでは、構造体がインターフェイスを実装できないのは、メソッド パラメーターの不一致が原因です。構造体のメソッドパラメータの型と、 Interface.
インターフェイスを実装する構造体の場合、そのメソッドはインターフェイスで定義されたメソッド シグネチャと正確に一致する必要があります。これには、メソッド名と戻り値の型だけでなく、パラメーターの型も含まれます。
提供されたコードでは、D 構造体の Connect メソッドは、(A) パラメーターの代わりに (*C) パラメーターを受け取ります。実装しようとしている B インターフェイスで必要となります。この不一致によりエラーが発生します。
問題を解決するには、インターフェイスの署名と一致するように Connect メソッドを変更する必要があります。
package main import "fmt" type A interface { Close() } type B interface { Connect() (A, error) } type C struct { } func (c *C) Close() { fmt.Println("Closing C") } type D struct { } func (d *D) Connect() (A, error) { c := new(C) return c, nil } func test(b B) { c, _ := b.Connect() fmt.Println("Creating A from B") c.Close() } func main() { d := new(D) test(d) }
この修正により、D 構造体は B インターフェイスを実装するようになりました。 :
func (d *D) Connect() (A, error) { c := new(C) return c, nil }
以上がGo 構造体がインターフェイスを実装していないのはなぜですか: メソッド パラメーターが一致していませんか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。