Direct naar de hoofdinhoud
Module 9 · Les 5 van 545/50 in de cursus~10 min
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
//go:build linux

package main

// this file is built ONLY on Linux

Drie absolute regels:

  1. De opmerking moet vóór package verschijnen.
  2. Het moet worden gevolgd door een lege regel.
  3. Geen spatie tussen // en go:build (het is een syntactische trigger, niet zomaar een opmerking).

Booleaanse expressies

De expressie na //go:build accepteert logische operatoren:

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)

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:

Code
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
//go:build integration

package mypkg

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

Uitvoering:

Bash
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
//go:build linux
// +build linux

package main

Gebruik voor nieuwe bestanden alleen het moderne //go:build formulier.

Oefeningen

Oefening#go.m9.l5.e1
Pogingen: 0Laden…

Voeg bovenaan het bestand de buildbeperking toe die het ALLEEN op Linux compileert. Onthoud de lege regel vóór het verpakken.

Editor laden…
Toon hint

Het //go:build commentaar gaat VOOR het pakket, op een regel apart, gevolgd door een lege regel.

Oplossing beschikbaar na 3 pogingen

Oefening#go.m9.l5.e2
Pogingen: 0Laden…

Voeg een buildbeperking toe die Windows UITSLUIT (gebruik de ontkenningsoperator!).

Editor laden…

Oplossing beschikbaar na 3 pogingen

Quiz#go.m9.l5.e3
Klaar

Welke vlag gebruikt u om tijdens de test een aangepaste 'integratie'-tag in te schakelen, gedeclareerd met //go:build-integratie?

Go
$ go test -tags=???
Antwoordmogelijkheden