В этом примере мы создадим интерфейс для вычисления площади и реализуем его для двух конкретных фигур - круга и квадрата.
Сначала создадим интерфейс 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