2016-09-09 40 views
0

我似乎在重複說功能,例如。有沒有一種慣用的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 
} 

回答

1

關於說話()函數,你可以嵌入

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() 
1

如果我沒有誤解,你想爲寶寶和人做一個「構造函數」。 Go中有一些等價的構造函數。

如果你有人力結構:

type Human struct { 
    Knowledge string 
} 

你可以調用一個函數makeHuman創建一個新的人類:

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

如果你喜歡返回一個指針,你可以選擇這一項:

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

您可以在下面的鏈接中查看這兩個選項:

相關問題