В Go полиморфизм реализуется через интерфейсы. Нет классов и наследования — вместо этого неявная реализация интерфейсов и композиция.
type Shape interface {
Area() float64
}
type Circle struct{ Radius float64 }
func (c Circle) Area() float64 { return math.Pi * c.Radius * c.Radius }
type Rect struct{ W, H float64 }
func (r Rect) Area() float64 { return r.W * r.H }
func PrintArea(s Shape) {
fmt.Println(s.Area()) // вызывается метод конкретного типа
}
Также есть параметрический полиморфизм через дженерики (Go 1.18+): func Max[T constraints.Ordered](a, b T) T. Но интерфейсный полиморфизм остаётся основным инструментом.