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。

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{}
}
我不知道这是否是一种不好的做法,可能有些情况需要重新设计而不是这样做。
- 2 回答
- 0 关注
- 189 浏览
添加回答
举报