为了账号安全,请及时绑定邮箱和手机立即绑定

依赖接口的golang接口

依赖接口的golang接口

Go
白衣非少年 2022-03-02 19:28:01
我不确定这些应该是两个单独的问题还是一个,但在我看来,这是一个由两个部分组成的问题 - 应该如何使用 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 的包产生依赖关系。
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

第一个问题:当你想做不同的任务时,你需要使用不同的函数名。让我们看看 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。


查看完整回答
反对 回复 2022-03-02
?
互换的青春

TA贡献1797条经验 获得超6个赞

为了实现一个接口,你需要有完全相同的方法名和签名。表示签名必须具有相同的类型。


尽管看起来很奇怪,但这两个没有相同的签名:


Foo() B

Foo() 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 impl


type 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{}

}

我不知道这是否是一种不好的做法,可能有些情况需要重新设计而不是这样做。


查看完整回答
反对 回复 2022-03-02
  • 2 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号