ホームページ > バックエンド開発 > Golang > 型の不一致を避けるために、Go Struct メソッドはインターフェイス定義とどのように一致する必要がありますか?

型の不一致を避けるために、Go Struct メソッドはインターフェイス定義とどのように一致する必要がありますか?

Susan Sarandon
リリース: 2024-12-15 02:16:13
オリジナル
875 人が閲覧しました

How Do Go Struct Methods Need to Match Interface Definitions to Avoid Type Mismatches?

構造体メソッドのインターフェイス実装の制限

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート