ホームページ > バックエンド開発 > Golang > メソッドパラメータがインターフェイスを実装する場合、Go 構造体はそのインターフェイスを実装しますか?

メソッドパラメータがインターフェイスを実装する場合、Go 構造体はそのインターフェイスを実装しますか?

Susan Sarandon
リリース: 2024-12-09 02:46:08
オリジナル
561 人が閲覧しました

Does a Go Struct Implement an Interface If a Method Parameter Implements That Interface?

メソッド パラメーターがインターフェイスを実装している場合、構造体はインターフェイスを実装しません

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

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