是否有一种惯用的Go方法来干掉以下代码:

时间:2016-09-09 22:57:19

标签: go

我似乎正在重复说话功能。

还有一种方法可以将婴儿和人类的初始知识转移到默认构造函数而不是在制作新生儿和人类时传递吗?

package main

import (
    "fmt"
)

func main() {
    h := Human{"good things"}
    d := Devil{}
    b := Baby{"ga ga"}
    b.speak()
    h.speak()
    d.poisons(&h)
    d.poisons(&b)
    b.speak()
    h.speak()
}

type Human struct {
    Knowledge string
}

type Devil struct{}

type Baby struct {
    Knowledge string
}

type Knowledgable interface {
    changeKnowledge(newKnowledge string)
}

func (d Devil) poisons(creature Knowledgable) {
    creature.changeKnowledge(" evil things")
}

func (h Human) speak() {
    fmt.Println(h.Knowledge)
}

func (b Baby) speak() {
    fmt.Println(b.Knowledge)
}

func (h *Human) changeKnowledge(newKnowledge string) {
    h.Knowledge += newKnowledge
}

func (b *Baby) changeKnowledge(newKnowledge string) {
    b.Knowledge = newKnowledge
}

2 个答案:

答案 0 :(得分:1)

如果我没有误解,你想做一个"构造函数"为了婴儿和人类。 Go中有一些构造函数的等价物。

如果你有人类结构:

type Human struct {
    Knowledge string
}

您可以调用函数makeHuman来创建新的人类:

func makeHuman(knowledge string) Human {
    return Human{knowledge}
}

如果您希望返回指针,可以选择以下指针:

func newHuman(knowledge string) *Human {
    return &Human{knowledge}
}

您可以在以下链接中查看这两个选项:

答案 1 :(得分:1)

关于可以嵌入的speak()函数

type Knowledge string
func (b Knowledge) speak() {
    fmt.Println(b)
}
type Baby struct {
    Knowledge
}
type Human struct {
    Knowledge
}

和关于构造函数,似乎对于这样一个简单类型buitin new()是可以的,但你可以写一个初始化器

func Ini(k Knowledgable) {
    switch k.(type) {
    case *Baby:
        k.changeKnowledge("ga-ga")
    case *Human:
        k.changeKnowledge("good things")
    }
}
事情将是

h := new(Human)
b:=new(Baby)
Ini(h)
Ini(b)
h.speak()