如何在Go中声明复合接口?

mod*_*che 6 interface go

以下接口定义了一组由mooing对象实现的方法:

type Mooing interface {
    Moo() string
}
Run Code Online (Sandbox Code Playgroud)

以下定义了一组通过放牧对象实现的方法:

type Grazing interface {
    EatGrass()
}
Run Code Online (Sandbox Code Playgroud)

我有一个在奶牛上运作的功能:

func Milk(cow *Cow)
Run Code Online (Sandbox Code Playgroud)

然而,它不一定是一头牛 - 任何符合Mooing并且Grazing足够接近的东西.在Go中,是否可以指定参数Mooing and Grazing?在伪代码中,类似下面的内容?

func Milk(cow {Mooing, Grazing})
Run Code Online (Sandbox Code Playgroud)

换句话说,只接受满足这两个接口的参数.

Jam*_*dge 20

您可以在Go中编写接口,如下所示:

type MooingAndGrazing interface {
    Mooing
    Grazing
}
Run Code Online (Sandbox Code Playgroud)

如果您不想声明新的命名类型,可以将其内联为:

func Milk(cow interface{Mooing; Grazing})
Run Code Online (Sandbox Code Playgroud)

您可以在此处试验此示例:http://play.golang.org/p/xAODkd85Zq

  • +1这个答案和问题本身让我想尝试Go. (3认同)