Lektionen des Moduls (5/5)
Build-Constraints und Tags
Build-Einschränkungen (auch Build-Tags genannt) steuern die Kompilierung einer Datei basierend auf Betriebssystem, Architektur, Go-Version oder benutzerdefinierten Tags, die auf der Befehlszeile übergeben werden. Sie werden für plattformübergreifenden Code, Opt-in-intensive Testdateien und ähnliche Szenarien verwendet.
Moderne Syntax: //go:build
Seit Go 1.17+ ist das kanonische Format der spezielle //go:build-Kommentar, der am Anfang der Datei vor package in einer eigenen Zeile platziert wird, gefolgt von einer Leerzeile:
//go:build linux
package main
// this file is built ONLY on LinuxDrei absolute Regeln:
- Der Kommentar muss vor
packagestehen. - Darauf muss eine Leerzeile folgen.
- Kein Leerzeichen zwischen
//undgo:build(es ist ein syntaktischer Auslöser, nicht irgendein Kommentar).
Boolesche Ausdrücke
Der Ausdruck nach //go:build akzeptiert 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)Die am häufigsten integrierten Tags:
- Betriebssystem:
linux,darwin,windows,freebsd,js... - Architektur:
amd64,arm64,386,wasm... - Go-Version:
go1.20,darwin0... (wahr, wenn die Version ≥ ist). darwin1: wahr, wenn CGO aktiviert ist.
Plattformübergreifend: Dateinamenkonvention
Über explizite Tags hinaus erkennt Go Dateinamensuffixe als implizite Build-Einschränkungen:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
Es handelt sich um das idiomatische Muster für plattformabhängige Implementierungen derselben Schnittstelle (jede Datei definiert dieselben Funktionen mit unterschiedlichem Code).
Benutzerdefinierte Tags: Teilnahme an umfangreichen Tests
Benutzerdefinierte Tags sind alle Bezeichner, die Sie auf der Befehlszeile übergeben:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandAusführung:
go test -tags=integration ./...Ohne -tags=integration ist die Datei für den Compiler unsichtbar (die darin enthaltenen Tests sind für go test nicht vorhanden). Dies ist die kanonische Methode, Unit-Tests (immer) von Integrationstests (auf Anfrage, möglicherweise nur in CI) zu trennen.
Alte Syntax: // +build (veraltet)
Vor 1.17 war das Format // +build linux (beachten Sie das Leerzeichen und dass es sich um +build und nicht um go:build handelt). Aus Gründen der Abwärtskompatibilität wird es weiterhin unterstützt, aber gofmt in Go 1.17+ fügt beides hinzu, wenn nur das alte gefunden wird:
//go:build linux
// +build linux
package mainFür neue Dateien verwenden Sie ausschließlich das moderne //go:build-Formular.
Übungen
Fügen Sie oben in der Datei die Build-Einschränkung hinzu, die sie NUR unter Linux kompiliert. Denken Sie an die Leerzeile vor dem Paket.
Hinweis anzeigen
Der //go:build-Kommentar steht VOR dem Paket in einer eigenen Zeile, gefolgt von einer Leerzeile.
Lösung nach 3 Versuchen verfügbar
Fügen Sie eine Build-Einschränkung hinzu, die Windows AUSSCHLIESST (verwenden Sie den Negationsoperator!).
Lösung nach 3 Versuchen verfügbar
Welches Flag verwenden Sie, um zum Testzeitpunkt ein benutzerdefiniertes „Integration“-Tag zu aktivieren, das mit //go:build Integration deklariert wurde?
$ go test -tags=???