Salt la conținutul principal
Modulul 9 · Lecția 5 din 545/50 în curs~10 min
Lecții din modul (5/5)

Construiți constrângeri și etichete

Constrângerile de construcție (numite și etichete de compilare) poartă compilarea unui fișier bazat pe sistemul de operare, arhitectură, versiunea Go sau etichete personalizate transmise pe linia de comandă. Sunt utilizate pentru codul multiplatformă, fișierele de testare grele de înscriere și scenarii similare.

Sintaxă modernă: //go:build

De la Go 1.17+, formatul canonic este comentariul special //go:build, plasat în partea de sus a fișierului înainte de package, pe o singură linie, urmată de o linie goală:

Go
//go:build linux

package main

// this file is built ONLY on Linux

Trei reguli absolute:

  1. Comentariul trebuie să apară înainte de package.
  2. Trebuie urmat de o linie goală.
  3. Fără spațiu între // și go:build (este un declanșator sintactic, nu orice comentariu).

Expresii booleene

Expresia după //go:build acceptă operatori logici:

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)

Cele mai comune etichete încorporate:

  • OS: linux, darwin, windows, freebsd, js...
  • Arhitectură: amd64, arm64, 386, wasm...
  • Versiunea Go: go1.20, go1.22... (adevărat dacă versiunea este ≥).
  • cgo: adevărat dacă cgo este activat.

Multiplatformă: convenție de nume de fișier

Dincolo de etichetele explicite, Go recunoaște sufixele de nume de fișier ca constrângeri implicite de construcție:

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

Este modelul idiomatic pentru implementările dependente de platformă ale aceleiași interfețe (fiecare fișier definește aceleași funcții cu cod diferit).

Etichete personalizate: optarea pentru teste grele

Etichetele personalizate sunt orice identificator pe care îl transmiți pe linia de comandă:

Go
//go:build integration

package mypkg

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

Execuţie:

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

Fără -tags=integration, fișierul este invizibil pentru compilator (testele din interiorul acestuia nu există pentru go test). Este modalitatea canonică de a separa testele unitare (întotdeauna) de testele de integrare (la cerere, poate doar în CI).

Sintaxă veche: // +build (învechit)

Înainte de 1.17, formatul era // +build linux (rețineți spațiul și că este +build, nu go:build). Este încă acceptat pentru compatibilitate cu versiunea anterioară, dar gofmt în Go 1.17+ adaugă ambele atunci când îl găsește doar pe cel vechi:

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

package main

Pentru fișierele noi, utilizați numai formularul modern //go:build.

Exerciții

Exercițiu#go.m9.l5.e1
Încercări: 0Se încarcă…

În partea de sus a fișierului adăugați constrângerea de compilare care o compilează NUMAI pe Linux. Amintiți-vă de linia goală înainte de pachet.

Se încarcă editorul...
Afișează indiciu

Comentariul //go:build merge ÎNAINTE de pachet, pe o singură linie, urmată de o linie goală.

Soluție disponibilă după 3 încercări

Exercițiu#go.m9.l5.e2
Încercări: 0Se încarcă…

Adăugați o constrângere de construcție care EXCLUDE Windows (utilizați operatorul de negație!).

Se încarcă editorul...

Soluție disponibilă după 3 încercări

Quiz#go.m9.l5.e3
Gata

Pentru a activa la momentul testării o etichetă de „integrare” personalizată declarată cu //go:build integration, ce semnalizare folosiți?

Go
$ go test -tags=???
Opțiuni de răspuns