В этом примере мы создадим интерфейс для вычисления площади и реализуем его для двух конкретных фигур - круга и квадрата.
Сначала создадим интерфейс Shape, который будет требовать метод Area():
type Shape interface {
Area() float64
}
Этот интерфейс:
Shape (фигура)Area(), который возвращает float64Создадим структуру для круга и реализуем метод Area():
type Circle struct {
Radius float64
}
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
Где:
Circle имеет поле Radius (радиус)Area() вычисляет площадь по формуле πr²Circle через receiver (c Circle)Аналогично создадим структуру для квадрата:
type Square struct {
Side float64
}
func (s Square) Area() float64 {
return s.Side * s.Side
}
Где:
Square имеет поле Side (длина стороны)Area() вычисляет площадь как side²SquareПокажем, как можно работать с этими реализациями через интерфейс:
func printArea(s Shape) {
fmt.Printf("Area: %.2f\n", s.Area())
}
func main() {
circle := Circle{Radius: 5}
square := Square{Side: 4}
printArea(circle) // Area: 78.54
printArea(square) // Area: 16.00
// Можно также хранить в переменной интерфейсного типа
var shape Shape = Circle{Radius: 3}
fmt.Println(shape.Area()) // 28.274333882308138
}
printArea может работать с любым типом, реализующим ShapeМожно явно проверить, что тип реализует интерфейс:
var _ Shape = (*Circle)(nil) // Проверка на этапе компиляции
Интерфейс можно расширить, добавив например метод для периметра:
type Shape interface {
Area() float64
Perimeter() float64
}
Но тогда потребуется реализовать оба метода во всех структурах.
Shape с методом Area()Circle и Square