有没有什么方法可以跨多个 struct 使用相同的函数来满足一个接口?

例如:

package main

import "fmt"

type Animal interface {
  Speak() string
}

type Dog struct {}

func (d Dog) Speak() string {
  return "Woof!"
}

type Wolf struct {}

func (w Wolf) Speak() string {
  return "HOWWWWWWWWL"
}

type Beagle struct {}

func (b Beagle) Speak() string {
  return "HOWWWWWWWWL"
}

type Cat struct {}

func (c Cat) Speak() string {
  return "Meow"
}

func main() {
    var a Animal
    a = Wolf{}
    fmt.Println(a.Speak())
}

因为Wolf和Beagle共享完全相同的函数,所以是否可以只编写一次该函数,然后在两个 struct 之间共享它,以便它们都能满足Animal呢?

推荐答案

您可以创建一个父 struct ,该 struct 由每个"嚎叫"的动物嵌入.父 struct 实现Speak() string方法,这意味着WolfBeagle实现Animal接口.

package main

import "fmt"

type Animal interface {
  Speak() string
}

type Howlers struct {
}

func (h Howlers) Speak() string {
  return "HOWWWWWWWWL"
}

type Dog struct {}

func (d Dog) Speak() string {
  return "Woof!"
}

type Wolf struct {
    Howlers
}

type Beagle struct {
    Howlers
}

type Cat struct {}

func (c Cat) Speak() string {
  return "Meow"
}

func main() {
    var a Animal
    a = Wolf{}
    fmt.Println(a.Speak())
}

https://play.golang.org/p/IMFnWdeweD

Go相关问答推荐

将Go程序导出到WASM—构建约束排除所有Go文件

如何使用Docker Compose配置Go,使main. go文件位于/CMD文件夹中

如何存储来自异步Goroutine的返回值列表?

GO框架Echo中间件的使用

这种合并排序的实现有什么问题?

Json.Unmarshal() 和 gin.BindJson() 之间的区别

使用 Go 解组 SOAP 消息

Go:如何在将 float64 转换为 float32 时判断精度损失

从Go中的随机日期开始以天为单位获取时间

如何将一片十六进制字节转换为整数

如何将多个切片打印为一个切片?

有没有办法判断值是否满足接口中定义的类型约束?

Golang BigInt 部门

使用 oklog/run 来自 Go 编译器的错误(无值)用作值

如何在 Windows 上使用 cgo 为 386 arch 构建 lib?

无限期运行 Go routine (完成后重新启动)

如何正确为 Go 中的值设置多种类型?

K8s 算子读取原始数据

如何在循环中旋转图像以便在 golang 中创建 GIF?

Go:用于 XML 解码的嵌套 struct 中的提升字段