Модульні уроки (5/5)
Створення обмежень і тегів
Обмеження збірки (також звані тегами збірки) регулюють компіляцію файлу на основі ОС, архітектури, версії Go або спеціальних тегів, переданих у командному рядку. Вони використовуються для кросплатформного коду, важких тестових файлів для підключення та подібних сценаріїв.
Сучасний синтаксис: //go:build
Починаючи з версії Go 1.17+, канонічним форматом є спеціальний коментар //go:build, розміщений у верхній частині файлу перед package, в окремому рядку, після якого йде порожній рядок:
//go:build linux
package main
// this file is built ONLY on LinuxТри абсолютних правила:
- Коментар має бути перед
package. - Після нього має бути порожній рядок.
- Жодного пробілу між
//таgo:build(це синтаксичний тригер, а не коментар).
Логічні вирази
Вираз після //go:build приймає логічні оператори:
//go:build linux && amd64 // both conditions
//go:build linux || darwin // any one (Unix-like)
//go:build !windows // negation
//go:build (linux || darwin) && !arm64
//go:build go1.22 // Go version ≥ 1.22
//go:build integration // custom tag (see below)Найпоширеніші вбудовані теги:
- ОС:
linux,darwin,windows,freebsd,js... - Архітектура:
amd64,arm64,386,wasm... - Версія Go:
go1.20,go1.22... (дійсно, якщо версія є ≥). cgo: істинно, якщо cgo увімкнено.
Кросплатформенність: угода про назву файлу
Окрім явних тегів, Go розпізнає суфікси назв файлів як неявні обмеження збірки:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
Це ідіоматичний шаблон для залежних від платформи реалізацій одного інтерфейсу (кожен файл визначає однакові функції з різним кодом).
Користувацькі теги: участь у складних тестах
Спеціальні теги – це будь-який ідентифікатор, який ви передаєте в командному рядку:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandВиконання:
go test -tags=integration ./...Без -tags=integration файл невидимий для компілятора (тести в ньому не існують для go test). Це канонічний спосіб відокремити модульні тести (завжди) від інтеграційних тестів (на вимогу, можливо, лише в CI).
Старий синтаксис: // +build (застаріле)
До 1.17 формат був // +build linux (зверніть увагу на пробіл і на те, що це +build, а не go:build). Він все ще підтримується для зворотної сумісності, але gofmt в Go 1.17+ додає обидва, коли знаходить лише старий:
//go:build linux
// +build linux
package mainДля нових файлів використовуйте лише сучасну форму //go:build.
вправи
У верхній частині файлу додайте обмеження збірки, яке компілює його ЛИШЕ в Linux. Запам'ятайте порожній рядок перед пакетом.
Показати підказку
Коментар //go:build розміщується ПЕРЕД пакетом, в окремому рядку, після якого йде порожній рядок.
Рішення доступне після 3 спроб
Додайте обмеження побудови, яке ВИКЛЮЧАЄ Windows (використовуйте оператор заперечення!).
Рішення доступне після 3 спроб
Щоб увімкнути під час тестування спеціальний тег «інтеграції», оголошений за допомогою //go:build інтеграції, який прапор ви використовуєте?
$ go test -tags=???