这是我的代码:
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 } |
当然,可以在另一个包中定义
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,我在模拟对象时遇到了完全相同的问题。 有什么办法吗?