На этом шаге мы начнем рассматривать использование семейства пользовательских типов в Go на примере.
Для множества взаимосвязанных сущностей, таких как геометрические фигуры, к которым можно применить некоторые общие операции (например, нарисовать фигуру), применяются следующие подходы для их реализации.
Первый состоит в использовании иерархии типов, или встроенных интерфейсов. Второй - в создании множества независимых интерфейсов, которые затем можно свободно компоновать.
На рис. 1 показан результат работы приложения, демонстрирующего пример применения семейства пользовательских типов.
Рис.1. Пример работы приложения
Для начала рассмотрим вспомогательные функции, предназначенные для работы с изображениями.
Пакет image из стандартной библиотеки экспортирует интерфейс image.Image. Этот интерфейс определяет три метода:
Интерфейс image.Image не определяет метода для изменения пикселя, даже при том, что некоторые типы в пакете image имеют метод Set(x, y int, fill color.Color).
В пакете image/draw имеется интерфейс draw.Image, встраивающий интерфейс image.Image, который определяет метод Set(). Среди прочих интерфейс draw.Image реализуется типами image.Gray и image.RGBA из стандартной библиотеки.
На следующем шаге продолжим рассматривать использование семейства пользовательских типов со вспомогательных функций.