Структуры в Go
Теория: Конструкторы структур
В Go нет специального ключевого слова constructor, как, например, в Java или C++. Но в реальной разработке нам часто нужно контролировать процесс создания объектов. Для этого используется соглашение: определяют обычную функцию, которая возвращает экземпляр структуры. Такие функции принято называть по схеме NewИмяТипа, например NewUser, NewOrder, NewConfig.
Прямое создание структуры
Начнем с примера:
Это рабочий способ, но у него есть минусы:
- Во-первых, логика размазывается по коду: если нужно проверять возраст, придется дублировать проверку в каждом месте.
- Во-вторых, значения по умолчанию легко забыть. Допустим, новый пользователь должен иметь возраст 18 лет, но при ручном создании придется каждый раз явно писать Age: 18.
- И наконец, поля могут изменяться напрямую, и это иногда ведет к некорректному состоянию.
Синтаксис конструктора
Чтобы избежать этих проблем, создают конструктор — функцию, которая собирает объект по правилам:
Обычно такие функции возвращают указатель на структуру. Название принято начинать с New и указывать тип.
Контраст: прямое создание и конструктор
Если объект простой и никаких правил нет, можно писать:
Но если нужно проверять данные или задавать дефолты, лучше использовать конструктор:
Теперь правила централизованы и не размазываются по коду.
Конструктор с дефолтными значениями
В реальном проекте часто нужно выставлять дефолты. Например, заказ всегда должен начинаться со статусом "new".
Так мы гарантируем, что бизнес-правило «новый заказ = статус new» всегда выполняется.
Конструктор и инкапсуляция
Особую ценность конструкторы показывают вместе с приватными полями. Поля, начинающиеся с маленькой буквы, недоступны вне пакета, и единственный способ создать объект — через конструктор.
Внешний код не может напрямую менять баланс, значит объект всегда будет в корректном состоянии.
Конструкторы с разной логикой
Иногда полезно иметь несколько конструкторов для разных сценариев:
Теперь код читается как «создаем админа» или «создаем пользователя», а не как «ставим поле Age вручную».
Когда без конструктора никак
Сложные объекты почти всегда требуют конструктора. Например, конфигурация сервиса:
Если писать конфиг руками, легко забыть или перепутать значения. Конструктор снимает эту проблему и централизует дефолты.
Итог
В Go конструкторы — это не встроенный механизм языка, а соглашение о написании функций NewTypeName. Они позволяют задать значения по умолчанию, встроить проверки, скрыть внутренние поля и предоставить разные варианты создания объектов. Такой подход делает код безопаснее, яснее и удобнее для сопровождения.


