我试图巩固Go提供的遗传概念(可能是"组合"而不是纯粹的遗传).但是,我无法理解为什么我不能使用"父"类型作为func参数来生成作用于参数的泛型函数.
package main
import "log"
type Animal struct {
Colour string
Name string
}
type Dog struct {
Animal
}
func PrintColour(a *Animal) {
log.Printf("%s\n", a.Colour)
}
func main () {
a := new (Animal)
a.Colour = "Void"
d := new (Dog)
d.Colour = "Black"
PrintColour(a)
PrintColour(d)
}
Run Code Online (Sandbox Code Playgroud)
假设我的理解不正确,我怎样才能在Go中实现我想要的?
编辑 注意:
我不想将行为附加到结构
我想保持指针类型作为方法参数,因为我在一个宠物项目上单独工作,这需要我操纵传入的结构,然后再对其进行操作.
实际上我的Dog结构将有额外的字段/成员; 希望这不会进一步混淆水
Bea*_*rtz 13
到目前为止,我喜欢这里的答案,我想添加一个允许您使用接口传入的接口进行静态类型检查:
package main
import (
"fmt"
)
type Animalizer interface {
GetColour() string
}
type Animal struct {
Colour string
Name string
}
type Dog struct {
Animal
}
func (a *Animal) GetColour() string {
return a.Colour
}
func PrintColour(a Animalizer) {
fmt.Print(a.GetColour())
}
func main() {
a := new(Animal)
a.Colour = "Void"
d := new(Dog)
d.Colour = "Black"
PrintColour(a)
PrintColour(d)
}
Run Code Online (Sandbox Code Playgroud)
可以添加更多字段Dog.Uriel的答案的不同之处在于,PrintColour如果Animalizer传入的是除了结构实现之外的其他内容,则调用将在编译时失败.
此外,您不必使用typeswitch,因为编译器知道Animalizer正在实现GetColour.
最后,行为(打印)与结构分离,GetColour只返回颜色.