ホームページ > バックエンド開発 > Golang > Go 構造体がインターフェイスを実装していないのはなぜですか: メソッド パラメーターが一致していませんか?

Go 構造体がインターフェイスを実装していないのはなぜですか: メソッド パラメーターが一致していませんか?

Barbara Streisand
リリース: 2024-12-04 12:28:11
オリジナル
539 人が閲覧しました

Why Doesn't My Go Struct Implement the Interface: Mismatched Method Parameters?

メソッド パラメーターの不一致によるインターフェイス実装の障害

問題:

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

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