package main import ( "bufio" "fmt" "os" "strings" ) func splitUnpack(s string) (string, string, string) { x := strings.Split(s, " ") return x[0], x[1], x[2] } type Animal interface { Eat() Move() Speak() } type Cow struct{} type Bird struct{} type Snake struct{} func (an Snake) Eat() { fmt.Println("mice") } func (an Snake) Move() { fmt.Println("slither") } func (an Snake) Speak() { fmt.Println("hsss") } func (an Bird) Eat() { fmt.Println("worms") } func (an Bird) Move() { fmt.Println("fly") } func (an Bird) Speak() { fmt.Println("peep") } func (an Cow) Eat() { fmt.Println("grass") } func (an Cow) Move() { fmt.Println("walk") } func (an Cow) Speak() { fmt.Println("moo") } func newanimal(i1, i2 string, cages map[string]Animal) { switch i2 { case "cow": cages[i1] = Cow{} case "snake": cages[i1] = Snake{} case "bird": cages[i1] = Bird{} } fmt.Println("Created it!") } func query(i1, i2 string, cages map[string]Animal) { switch i2 { case "speak": cages[i1].Speak() case "move": cages[i1].Move() case "eat": cages[i1].Eat() } } func main() { scanner := bufio.NewScanner(os.Stdin) var commandtype string var input1 string var input2 string animalCages := make(map[string]Animal) for { fmt.Println(">") scanner.Scan() commandtype, input1, input2 = splitUnpack(scanner.Text()) if commandtype == "newanimal" { newanimal(input1, input2, animalCages) } else if commandtype == "query" { query(input1, input2, animalCages) } } }