❓
В чём разница между //go:build
и // +build
Обе директивы — это build constraints (ограничения сборки), которые указывают компилятору, при каких условиях включать файл в сборку. Разница в синтаксисе и возрасте.
// +build — старая форма, использовавшаяся до Go 1.17:
• Размещается в начале файла, до объявления пакета.
• После блока директив обязательна пустая строка.
• Условия комбинируются неочевидно: пробел означает «И», запятая — «ИЛИ», а несколько строк — тоже «И». Это часто путало.
//go:build — новая форма, введённая в Go 1.17:
• Использует привычные логические выражения с &&, ||, ! и скобками.
• Читается гораздо понятнее.
// Старая форма:
// +build linux,amd64 darwin
// Новая форма:
//go:build (linux && amd64) || darwin
Начиная с Go 1.17, инструмент gofmt автоматически добавляет //go:build рядом со старыми // +build, синхронизируя их. Сегодня рекомендуется использовать именно //go:build, а старую форму оставляют лишь для совместимости со совсем древними версиями Go.
🐸 Библиотека Go для собеса