如何实现带返回类型的接口方法是Golang中的一个接口

Posted

技术标签:

【中文标题】如何实现带返回类型的接口方法是Golang中的一个接口【英文标题】:How to implement interface method with return type is an interface in Golang 【发布时间】:2012-08-08 22:25:41 【问题描述】:

这是我的代码:

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

【问题讨论】:

【参考方案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

【讨论】:

这没有回答问题。问题是我们希望将接口放在一个新文件中,而不能更改原始定义。 @epsalon 您的问题与原始问题有何关系?请多描述一下。 我认为@epsalon 的问题非常中肯。假设 A 和 B 都定义在一个独立且不可访问的包中。如何追溯定义接口 IA 和 IB?您可能想要这样做的一个示例是,如果您尝试定义这些接口以便在完全不同的包中使用 A 和 B 的模拟,而不能修改声明 A 和 B 的原始文件。 是的,@ishaaq,这正是我的问题。 @ishaaq,我在模拟对象时遇到了完全相同的问题。有什么解决办法吗?

以上是关于如何实现带返回类型的接口方法是Golang中的一个接口的主要内容,如果未能解决你的问题,请参考以下文章

Go语言学习之旅--接口

Go语言学习之旅--接口

Go语言学习之旅--接口

[golang]语法基础之接口

一文带你吃透java中的接口

Golang方法和接口