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:build linux
package main
// this file is built ONLY on LinuxTrei reguli absolute:
- Comentariul trebuie să apară înainte de
package. - Trebuie urmat de o linie goală.
- Fără spațiu între
//șigo:build(este un declanșator sintactic, nu orice comentariu).
Expresii booleene
Expresia după //go:build acceptă operatori logici:
//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:
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:build integration
package mypkg
// tests that need a real DB, run only on demandExecuţie:
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:build linux
// +build linux
package mainPentru fișierele noi, utilizați numai formularul modern //go:build.
Exerciții
Î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.
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
Adăugați o constrângere de construcție care EXCLUDE Windows (utilizați operatorul de negație!).
Soluție disponibilă după 3 încercări
Pentru a activa la momentul testării o etichetă de „integrare” personalizată declarată cu //go:build integration, ce semnalizare folosiți?
$ go test -tags=???