That's essentially how Go is designed: type Shape interface { draw() }
type Circle struct { ... } type Square struct { ... } func (c *Circle) draw() { ... } func (s *Square) draw() { ... } func main() { var shape Shape var circle Circle var square Square shape = circle shape.draw() // circle.draw() shape = square shape.draw() // square.draw() }