依赖接口的golang接口

我不确定这些应该是两个单独的问题还是一个,但在我看来,这是一个由两个部分组成的问题 - 应该如何使用 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 的包产生依赖关系。


白衣非少年
浏览 190回答 2
2回答

阿波罗的战车

第一个问题:当你想做不同的任务时,你需要使用不同的函数名。让我们看看 strconv 包中的标准库是如何解决的:https ://golang.org/pkg/strconv/#pkg-index在那里查看 append 函数的不同声明。每种不同类型都有功能。因此,如果您期望 FooInt 功能,您的界面也应该是 FooInter,...第二个问题:作为一个小例子。当你想使用 io.Writer 接口时,你不需要导入整个 io 包。将 Writer 声明复制到您自己的包中是完全可以的。如果你这样做正确,每个 io.Writer 实现都会自动实现你自己的 Writer 接口。阅读其他评论后,您可能有不同的情况:假设有一个包 a 和 b 具有接口 aA 和 bB 如果有这样的情况:type A interface{  Foo() b.B}你必须为aA编写一个实现,然后你需要导入包b。但这会使您的二进制文件不会更大,因为您将始终需要导入包 a,这取决于 b。

互换的青春

为了实现一个接口,你需要有完全相同的方法名和签名。表示签名必须具有相同的类型。尽管看起来很奇怪,但这两个没有相同的签名:Foo() BFoo() b_impl {}b_impl实现没关系B。为了克服需要在导入包B中声明,可以使用匿名类型。这样,编译器将不需要方法签名的特定类型。type A interface {    Foo() interface{Bar()}}这也可以写成嵌入B:type A interface {    Foo() interface{B}}尽管如此,a_impl必须具有相同的签名,因此它还需要返回一个匿名接口。您也可以B在 的包中声明相同的接口a_impl,并将其嵌入到匿名接口中。package impltype B interface {    Bar()}type b_impl struct{}func (b b_impl) Bar() {}type a_impl struct{}func (a a_impl) Foo() interface{B} {    return b_impl{}}我不知道这是否是一种不好的做法,可能有些情况需要重新设计而不是这样做。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go