这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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!"
}

我收到一个错误:

1
2
3
4
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()的返回类型,对吗?

只是改变

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

进入

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

当然,可以在另一个包中定义IB。 因此,如果两个接口都在包foo中定义并且实现在包bar中,则声明为

1
2
3
type IA interface {
    FB() IB
}

虽然实现是

1
2
3
func (a *A) FB() foo.IB {
    return a.b
}
  • 这不能回答问题。 问题是我们希望将接口包含在新文件中,而又不能更改原始定义。
  • @epsalon您的问题与原始问题有何关系? 请描述更多。
  • 我认为@epsalons问题非常相关。 假设A和B都在单独且不可访问的程序包中定义。 如何才能追溯定义接口IA和IB? 例如,如果您试图定义这些接口以便在完全不同的包中同时对A和B使用模拟,而又不能修改声明A和B的原始文件,则可能需要执行此操作。
  • 是的,@ ishaaq,这正是我的问题。
  • @ishaaq,我在模拟对象时遇到了完全相同的问题。 有什么办法吗?