Modulelessen (5/5)
Bouw beperkingen en tags
Buildbeperkingen (ook wel build-tags genoemd) blokkeren de compilatie van een bestand op basis van besturingssysteem, architectuur, Go-versie of aangepaste tags die op de opdrachtregel worden doorgegeven. Ze worden gebruikt voor platformonafhankelijke code, zware testbestanden waarvoor u zich moet aanmelden en soortgelijke scenario's.
Moderne syntaxis: //go:build
Sinds Go 1.17+ is het canonieke formaat de speciale //go:build opmerking, geplaatst bovenaan het bestand vóór package, op een regel apart, gevolgd door een lege regel:
//go:build linux
package main
// this file is built ONLY on LinuxDrie absolute regels:
- De opmerking moet vóór
packageverschijnen. - Het moet worden gevolgd door een lege regel.
- Geen spatie tussen
//engo:build(het is een syntactische trigger, niet zomaar een opmerking).
Booleaanse expressies
De expressie na //go:build accepteert logische operatoren:
//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)De meest voorkomende ingebouwde tags:
- OS:
linux,darwin,windows,freebsd,js... - Architectuur:
amd64,arm64,386,wasm... - Go-versie:
go1.20,go1.22... (waar als de versie is ≥). cgo: waar als cgo is ingeschakeld.
Cross-platform: bestandsnaamconventie
Naast expliciete tags herkent Go bestandsnaamachtervoegsels als impliciete buildbeperkingen:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
Het is het idiomatische patroon voor platformafhankelijke implementaties van dezelfde interface (elk bestand definieert dezelfde functies met verschillende code).
Aangepaste tags: kiezen voor zware tests
Aangepaste tags zijn elke identificatie die u doorgeeft op de opdrachtregel:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandUitvoering:
go test -tags=integration ./...Zonder -tags=integration is het bestand onzichtbaar voor de compiler (de tests erin bestaan niet voor go test). Het is de canonieke manier om unit-tests (altijd) te scheiden van integratietests (op aanvraag, misschien alleen in CI).
Oude syntaxis: // +build (verouderd)
Vóór 1.17 was het formaat // +build linux (let op de spatie, en dat het +build is, en niet go:build). Het wordt nog steeds ondersteund voor achterwaartse compatibiliteit, maar gofmt in Go 1.17+ voegt beide toe als alleen de oude wordt gevonden:
//go:build linux
// +build linux
package mainGebruik voor nieuwe bestanden alleen het moderne //go:build formulier.
Oefeningen
Voeg bovenaan het bestand de buildbeperking toe die het ALLEEN op Linux compileert. Onthoud de lege regel vóór het verpakken.
Toon hint
Het //go:build commentaar gaat VOOR het pakket, op een regel apart, gevolgd door een lege regel.
Oplossing beschikbaar na 3 pogingen
Voeg een buildbeperking toe die Windows UITSLUIT (gebruik de ontkenningsoperator!).
Oplossing beschikbaar na 3 pogingen
Welke vlag gebruikt u om tijdens de test een aangepaste 'integratie'-tag in te schakelen, gedeclareerd met //go:build-integratie?
$ go test -tags=???