Можно что-то вроде этого написать, будет очень похоже )
package main
import "fmt"
// Doer do
type Doer interface {
eat()
}
// Animal is Animal
type Animal struct {
name string
}
func (animal *Animal) eat() {
fmt.Println("My name is", animal.name)
}
// Shark is Animal
type Shark struct {
Animal
}
func (shark *Shark) eat() {
fmt.Println("My name is", shark.name, "and i eat seals")
}
func start(doer Doer) {
doer.eat()
}
func main() {
animal := new(Animal)
animal.name = "Kangaroo"
start(animal)
fmt.Println("-----------------------")
shark := new(Shark)
shark.name = "Shark"
start(shark)
}