我在函数参数中遇到了接口问题。
package main
import (
"fmt"
)
type A interface {
New() A
B()
C()
}
type B interface {
New() B
B()
}
type AS struct {}
func (AS) New() A {
return AS{}
}
func (AS) B() {}
func (AS) C() {}
func Hello(b B) {
b.New()
}
func main() {
fmt.Println("Hello, playground")
as := AS{}
a := A(as)
Hello(a)
}
我有这个错误:
tmp/sandbox293137995/main.go:35: cannot use a (type A) as type B in argument to Hello:
A does not implement B (wrong type for New method)
have New() A
want New() B
如果我想在函数Hello中使用接口A,我该如何重构这段代码? 谢谢!
答案 0 :(得分:2)
如果您希望在接受A
接口的任何地方使用接口B
,A
必须实施所有 {{1}中定义的方法}}。这包括B
和New() B
。
基本上,您可以B()
嵌入B
,如下所示:
A
您可以找到一个有效的例子here。
请注意,在我的示例中,我仍然需要在type A interface {
NewA() A
C()
B
}
结构中实现A
和B
的所有方法。
我还必须重命名2 AS
个函数。在Go中,即使返回值不同,也不能在同一个包中使用相同名称的2个函数。
通常,您不需要在界面中提供构造函数,因为可以在没有它们的情况下创建结构。