Интерфейсы в 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 с методами:
- Напиши функцию Grow([]Resizable, factor float64) float64, которая принимает слайс объектов Resizable, увеличивает их с помощью метода Grow и возвращает число - насколько суммарно увеличилась площадь фигур
- Дополнительно: добавь еще фигуры. Например, прямоугольный треугольник
В процессе будут сложности, будут ошибки. Не бойся обращаться к гуглу или нейронкам. Главное - не проси у них решения самого задания.
В итоге ты придешь к пониманию, что интерфейсы решают главную проблему - как написать код, который работает с разными типами данных.
Без интерфейсов тебе пришлось бы писать отдельные функции:
А с интерфейсами достаточно одной функции PrintArea(Shape), которая работает с любой фигурой, если ты создал для нее метод Area() float64