去"继承" - 在结构中使用匿名类型作为方法参数

Ale*_*lex 8 inheritance go

我试图巩固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只返回颜色.