【发布时间】:2016-08-23 18:08:16
【问题描述】:
我不确定这些应该是两个单独的问题还是一个,但在我看来,这是一个由两个部分组成的问题 - 应该如何使用 go 接口?我有这两个挣扎:
接口的方法是全局范围的:如果我有接口 A 和接口 B,它们都实现了相同的方法 Foo,但具有不同的参数或返回类型,我无法从同一类型同时实现两者。例如,我在一个返回类型为 []byte 的接口和另一个 ([]byte, error) 接口中有 GetBytes() 方法,我应该如何克服这个问题?
我遇到的另一个问题是,当我尝试定义接口时说接口 A 具有返回在同一层中定义的接口 B 的方法。现在,如果我想创建一个实现 A 的对象,如果我返回实现 B 的结构,则 go 不够聪明,无法推断该方法实现了 A 中的方法,它迫使我创建对 B 的依赖。这似乎完全击败了首先说明接口工作的方式。我怎样才能避免这个问题?
例如,如果我有:
type B interface {
Bar()
}
type A interface {
Foo() B
}
对于以下结构:
type b_impl struct{}
func (b b_impl) Bar() {}
type a_impl struct{}
一个 foo 方法
func (a a_impl) Foo() b_impl {}
不满足接口A,需要做:
func (a a_impl) Foo() B {}
它对声明 B 的包产生依赖关系。
【问题讨论】:
-
“我应该如何克服这个问题?”你不能,因为 Go 不支持方法重载。见golang.org/doc/faq#overloading。我不太了解您的第二个问题,无法尝试回答。也许提供一个代码示例会有所帮助。
-
感谢@smarx - 我编辑了问题,并为第二部分提供了更多详细信息
-
我不认为你可以对你的第二个问题做任何事情。
-
对于您的第二个“问题”:是问题吗?如果方法 Foo 返回一个 Barer,它返回一个 Barer 而不是 b_impl。
-
@gsf,我一遍又一遍地阅读你的最后评论,但我无法理解你想说什么。接口是一种只定义方法集的类型,但它们仍然只是一种类型。如果在一个包中声明
B,在另一个包中引用B,那么当然需要导入B的包。为什么这是个问题?io包经常被导入以使用io.Reader和io.Writer。