Go: вложенные поля структур можно инициализировать напрямую

В го появилась небольшая, но приятная возможность.

Код с помощью этой фичи становиться чуть чище. Да, еще остались те, кто его читает...и даже пишет сам.

Раньше, если структура содержала встроенную структуру, при создании объекта приходилось явно указывать её имя.

например: type SystemColumns struct { CreatedAt time.Time UpdatedAt time.Time } type User struct { ID string Name string SystemColumns }

до Go 1.27: user := User{ ID: "123", Name: "Alex", SystemColumns: SystemColumns{ CreatedAt: time.Now(), UpdatedAt: time.Now(), }, }

Работает, но вложенность добавляет немного лишнего кода.

В го 1.27 можно проще: user := User{ ID: "123", Name: "Alex", CreatedAt: time.Now(), UpdatedAt: time.Now(), }

Поля встроенной структуры теперь можно указывать прямо в литерале User. Это работает и для полей, продвигаемых через несколько уровней вложенных встроенных структур.

Но есть ограничения.

Например, нельзя одновременно указать всю встроенную структуру и одно из её продвигаемых полей:

user := User{ SystemColumns: SystemColumns{}, CreatedAt: time.Now(), // ошибка компиляции }

Также это не означает, что можно писать произвольные пути через точку вроде SystemColumns.CreatedAt. Ключом служит допустимое имя поля, разрешаемое по правилам селекторов Go.

Что важно: это изменение синтаксиса, а не поведения структур. Оно не меняет их layout и не добавляет новых аллокаций само по себе. Мелочь? Да.

Но если у тебя много DTO, конфигурационных структур или моделей с общими встроенными полями, код становится заметно компактнее. Документация: Go 1.27 Release Notes.