構造体メソッドのインターフェイス実装の制限
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) { return &C{}, nil } // Return type mismatch func test(b B) {} func main() { d := &D{} test(d) // Error: type mismatch for Connect() method }
ここで、エラー メッセージは次のとおりです: 「テストする引数の型 B として d (型 D) を使用できません: D は実装されていません」 B (Connect メソッドのタイプが間違っています)"。これは、D の Connect メソッドの戻り値の型が *C であり、B インターフェイスで指定された (A, error) 戻り値の型と一致しないために発生します。
したがって、構造体のメソッドのパラメータまたは戻り値が異なる場合、対応するインターフェイス メソッドから型を取得した場合、構造体はインターフェイスを実装しません。
問題
この問題を解決するには、構造体 D の Connect メソッドをインターフェイス B の Connect メソッドと一致させる必要があります。これには、期待される (A、エラー) 型を返すようにすることが含まれます。
import "fmt" type A interface { Close() } type B interface { Connect() (A, error) } type C struct { name string } func (c *C) Close() { fmt.Println("C closed") } type D struct {} func (d *D) Connect() (A, error) { return &C{"D"}, nil } func test(b B) { b.Connect().Close() // Call Close() on the returned A } func main() { test(&D{}) }
この変更により、struct D の Connect メソッドが B インターフェイスの定義に準拠するようになるため、コードはエラーなしでコンパイルおよび実行されます。
以上が型の不一致を避けるために、Go Struct メソッドはインターフェイス定義とどのように一致する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。