Подтвердить что ты не робот

Как реализовать метод интерфейса с типом возврата - это интерфейс в Golang

Вот мой код:

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 или modifi A. Что делать, если я определяю IA, IB в другом пакете (так что я могу поделиться этим интерфейсом), я должен импортировать свой пакет и использовать IB в качестве возвращаемого типа A.FB(), правильно?

4b9b3361

Ответ 1

Просто измените

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

в

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

Конечно, IB может быть определен в другом пакете. Поэтому, если оба интерфейса определены в пакете foo, а реализации находятся в пакете bar, тогда объявление

type IA interface {
    FB() IB
}

а реализация -

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