如何在函数中使用接口,其中参数是另一个接口,具有相同的函数列表?

时间:2017-08-15 16:40:52

标签: go

我在函数参数中遇到了接口问题。

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

Playground

如果我想在函数Hello中使用接口A,我该如何重构这段代码? 谢谢!

1 个答案:

答案 0 :(得分:2)

如果您希望在接受A接口的任何地方使用接口BA必须实施所有 {{1}中定义的方法}}。这包括BNew() B

基本上,您可以B()嵌入B,如下所示:

A

您可以找到一个有效的例子here

请注意,在我的示例中,我仍然需要在type A interface { NewA() A C() B } 结构中实现AB的所有方法。

我还必须重命名2 AS个函数。在Go中,即使返回值不同,也不能在同一个包中使用相同名称的2个函数。

通常,您不需要在界面中提供构造函数,因为可以在没有它们的情况下创建结构。