Перейти до основного вмісту
Модуль 9 · Урок 5 із 545/50 у курсі~10 min
Модульні уроки (5/5)

Створення обмежень і тегів

Обмеження збірки (також звані тегами збірки) регулюють компіляцію файлу на основі ОС, архітектури, версії Go або спеціальних тегів, переданих у командному рядку. Вони використовуються для кросплатформного коду, важких тестових файлів для підключення та подібних сценаріїв.

Сучасний синтаксис: //go:build

Починаючи з версії Go 1.17+, канонічним форматом є спеціальний коментар //go:build, розміщений у верхній частині файлу перед package, в окремому рядку, після якого йде порожній рядок:

Go
//go:build linux

package main

// this file is built ONLY on Linux

Три абсолютних правила:

  1. Коментар має бути перед package.
  2. Після нього має бути порожній рядок.
  3. Жодного пробілу між // та go:build (це синтаксичний тригер, а не коментар).

Логічні вирази

Вираз після //go:build приймає логічні оператори:

Go
//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 розпізнає суфікси назв файлів як неявні обмеження збірки:

Code
db_linux.go         // linux only
db_windows.go       // windows only
db_linux_amd64.go   // linux/amd64 only

Це ідіоматичний шаблон для залежних від платформи реалізацій одного інтерфейсу (кожен файл визначає однакові функції з різним кодом).

Користувацькі теги: участь у складних тестах

Спеціальні теги – це будь-який ідентифікатор, який ви передаєте в командному рядку:

Go
//go:build integration

package mypkg

// tests that need a real DB, run only on demand

Виконання:

Bash
go test -tags=integration ./...

Без -tags=integration файл невидимий для компілятора (тести в ньому не існують для go test). Це канонічний спосіб відокремити модульні тести (завжди) від інтеграційних тестів (на вимогу, можливо, лише в CI).

Старий синтаксис: // +build (застаріле)

До 1.17 формат був // +build linux (зверніть увагу на пробіл і на те, що це +build, а не go:build). Він все ще підтримується для зворотної сумісності, але gofmt в Go 1.17+ додає обидва, коли знаходить лише старий:

Go
//go:build linux
// +build linux

package main

Для нових файлів використовуйте лише сучасну форму //go:build.

вправи

вправи#go.m9.l5.e1
Спроби: 0Завантаження…

У верхній частині файлу додайте обмеження збірки, яке компілює його ЛИШЕ в Linux. Запам'ятайте порожній рядок перед пакетом.

Завантаження редактора…
Показати підказку

Коментар //go:build розміщується ПЕРЕД пакетом, в окремому рядку, після якого йде порожній рядок.

Рішення доступне після 3 спроб

вправи#go.m9.l5.e2
Спроби: 0Завантаження…

Додайте обмеження побудови, яке ВИКЛЮЧАЄ Windows (використовуйте оператор заперечення!).

Завантаження редактора…

Рішення доступне після 3 спроб

Quiz#go.m9.l5.e3
Готовий

Щоб увімкнути під час тестування спеціальний тег «інтеграції», оголошений за допомогою //go:build інтеграції, який прапор ви використовуєте?

Go
$ go test -tags=???
Варіанти відповідей