Suppose I have two pets, a cat named Lucy and a dog named Fido. I have taught them both the same trick, "speak".
In the future I would like to obtain more pets, and teach them different tricks, so in anticipation, I've coded to an interface:
package main
import "fmt"
type Pet interface {
speak() string
}
type Dog struct {
speech string
}
type Cat struct {
speech string
}
func (c Cat) speak() string {
return c.speech
}
func (d Dog) speak() string {
return d.speech
}
func getSpeech(p Pet) string {
return p.speak()
}
func main() {
Fido := Dog{"woof"}
Lucy := Cat{"meow"}
fmt.Println("Fido says:", getSpeech(Fido)) // Fido says: woof
fmt.Println("Lucy says:", getSpeech(Lucy)) // Lucy says: meow
}
Now, although this works well, it seems unnecessarily verbose. I'm clearly repeating myself. Also, assuming all Dogs say "woof" and all Cats say "meow", is it idiomatic to initialize the string inside the struct?
How would you re-factor this code to be more DRY without losing the benefit of an interface?