このプログラムでは、スライス内の特定の実装を返す関数への参照を保存しています。funcのスライスへの参照の保存
SpeakAllの中で、私はそれに対応するオブジェクトを取得し、Speakを呼び出して各関数を呼び出しています。
問題:配列を反復処理し、出力
package main
import "fmt"
type IAnimal interface {
Speak() string
}
type Cat struct {}
func (c Cat) Speak() string {
return "meow!"
}
type Dog struct {}
func (d Dog) Speak() string {
return "woof!"
}
type Zoo struct {
Animals []func() IAnimal
}
func (zoo Zoo) AddAnimal(animal func() IAnimal) {
if zoo.Animals == nil {
zoo.Animals = make([]func() IAnimal, 0)
}
zoo.Animals = append(zoo.Animals, animal)
}
func (zoo Zoo) SpeakAll() {
for _, animal := range zoo.Animals {
fmt.Println(animal().Speak())
}
}
func main() {
catFunc := func() IAnimal {return Cat{}}
dogFunc := func() IAnimal {return Dog{}}
z := Zoo{}
z.AddAnimal(catFunc)
z.AddAnimal(dogFunc)
z.SpeakAll()
}
あなたは、例えば、ポインタの方法であることがAddAnimalを必要とします'FUNC(動物園動物園*)AddAnimal(動物FUNC()IAnimal){' https://play.golang.org/p/Tlt4zzz4zH一度ゼロindiexから出発して動物園の動物を除去することが可能 – mkopriva
おかげで、スライスが空になるまでSpeakAllメソッド内の 'Array shift'メソッド –