首页 > 解决方案 > 在 Go 中显式选择接口的实现方法

问题描述

假设我必须遵循接口Foo以及A哪些B实现Foo

type Foo interface {
    SayHi()
    SayBye()
}

type A struct {}

func(a A) SayHi() {}

func(a A) SayBye() {}

type B struct {}

func(b B) SayHi() {}

func(b B) SayBye() {}

如果我想要方法 from但方法 from ,最好的语法方法是什么?SayHiASayByeB

我总是可以这样做:

type AB struct {
    a A
    b B
}

func(ab AB) SayHi() { ab.a.SayHi() }

func(ab AB) SayBye() { ab.a.SayBye() }

但这需要我为每个方法创建一个包装器。另一种方法是嵌入,A但这会产生冲突。BAB

标签: gomethodsstructinterfaceembedding

解决方案


您可以嵌入 2种接口类型,它们仅从不同类型定义要使用(“继承”)的部分(方法):

type AB struct {
    Hier
    Byer
}

type Hier interface {
    SayHi()
}
type Byer interface {
    SayBye()
}

基本上使用Hierand Byer“屏蔽”其他方法,因此嵌入它们(而不是Aand B)将解决名称冲突(歧义)。

让我们让实现打印他们是谁以进行验证:

func (a A) SayHi()  { fmt.Println("A says Hi") }
func (a A) SayBye() { fmt.Println("A says Bye") }
func (b B) SayHi()  { fmt.Println("B says Hi") }
func (b B) SayBye() { fmt.Println("B says Bye") }

使用它:

var ab Foo = AB{
    Hier: A{},
    Byer: B{},
}
ab.SayHi()
ab.SayBye()

输出将是(在Go Playground上尝试):

A says Hi
B says Bye

当然,如果我们现在有Hierand Byer,我们可以使用它们来简化Foo,如果我们想:

type Foo interface {
    Hier
    Byer
}

推荐阅读