我似乎正在重复说话功能。
还有一种方法可以将婴儿和人类的初始知识转移到默认构造函数而不是在制作新生儿和人类时传递吗?
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
}
答案 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}
}
您可以在以下链接中查看这两个选项:
使用makeHuman
:https://play.golang.org/p/2hlTpnVXF9
使用newHuman
:https://play.golang.org/p/ru63o81C4V
答案 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()