July 10, 2025

Интерфейсы в Go

Интерфейс - это просто набор методов. Любой тип данных может стать реализацией этого интерфейса. Если у твоего типа есть все методы, которые требует интерфейс, то твой тип становится реализацией этого интерфейса.

Новичкам эта тема заходит довольно сложно. Ключевая сложность - люди не понимают, зачем вообще нужны интерфейсы.


Ниже список заданий. Выполняй их по очереди, и очень возможно, что ты наконец поймешь, что дают интерфейсы:

  • Создай структуру Rectangle с полями Width и Height.
  • Добавь метод Area(), который возвращает площадь прямоугольника.
  • Создай интерфейс Shape с методом Area().
  • Напиши функцию PrintArea, которая принимает Shape и выводит площадь.
  • Добавь новый тип Circle с полем Radius.
  • Реализуй для него метод Area(), чтобы он соответствовал интерфейсу Shape.
  • Объяви экземпляры Rectangle и Circle, затем создай слайс фигур []Shape, положи туда эти экземпляры.
  • Пройдись по слайсу циклом и выведи площади всех фигур.
  • Добавь метод Grow(factor float64) к Rectangle, который увеличивает размеры на множитель. Метод должен менять сам объект - используй указатель в получателе.
  • Добавь метод Grow(factor float64) к Circle, который увеличивает радиус на множитель. Метод должен менять сам объект - используй указатель в получателе.
  • Создай интерфейс Resizable с методами:
    • Area() float64,
    • Grow(factor float64)
  • Напиши функцию Grow([]Resizable, factor float64) float64, которая принимает слайс объектов Resizable, увеличивает их с помощью метода Grow и возвращает число - насколько суммарно увеличилась площадь фигур
  • Дополнительно: добавь еще фигуры. Например, прямоугольный треугольник

В процессе будут сложности, будут ошибки. Не бойся обращаться к гуглу или нейронкам. Главное - не проси у них решения самого задания.

В итоге ты придешь к пониманию, что интерфейсы решают главную проблему - как написать код, который работает с разными типами данных.

Без интерфейсов тебе пришлось бы писать отдельные функции:

  • PrintRectangleArea(Rectangle)
  • PrintCircleArea(Circle)
  • PrintTriangleArea(Triangle)

А с интерфейсами достаточно одной функции PrintArea(Shape), которая работает с любой фигурой, если ты создал для нее метод Area() float64