33

これが私のコードです:

type IA interface {
    FB() IB
}

type IB interface {
    Bar() string
}

type A struct {
    b *B
}

func (a *A) FB() *B {
    return a.b
}

type B struct{}

func (b *B) Bar() string {
    return "Bar!"
}

エラーが発生します:

cannot use a (type *A) as type IA in function argument:
    *A does not implement IA (wrong type for FB method)
        have FB() *B
        want FB() IB

完全なコードは次のとおりです: http://play.golang.org/p/udhsZgW3W2 IAインターフェイス
を編集するか、 A構造体を変更する必要がありますか? 他のパッケージで IA、IB を定義する場合 (これらのインターフェースを共有できるようにするため)、自分のパッケージをインポートして IB を A.FB() の戻り型として使用する必要がありますが、それは正しいですか?

4

1 に答える 1

21

変えるだけ

func (a *A) FB() *B {
    return a.b
}

の中へ

func (a *A) FB() IB {
    return a.b
}

確かIBに別のパッケージで定義できます。したがって、両方のインターフェースが package で定義されfoo、実装が packagebarにある場合、宣言は次のようになります。

type IA interface {
    FB() IB
}

実装は

func (a *A) FB() foo.IB {
    return a.b
}
于 2012-08-12T11:59:56.173 に答える