Direkt zum Hauptinhalt springen
eLearner.app
Modul 9 · Lektion 5 von 545/50 im Kurs~10 min
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
//go:build linux

package main

// this file is built ONLY on Linux

Drei absolute Regeln:

  1. Der Kommentar muss vor package stehen.
  2. Darauf muss eine Leerzeile folgen.
  3. Kein Leerzeichen zwischen // und go:build (es ist ein syntaktischer Auslöser, nicht irgendein Kommentar).

Boolesche Ausdrücke

Der Ausdruck nach //go:build akzeptiert 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)

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:

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

package mypkg

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

Ausführung:

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

package main

Für neue Dateien verwenden Sie ausschließlich das moderne //go:build-Formular.

Übungen

Übung#go.m9.l5.e1
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#go.m9.l5.e2
Versuche: 0Wird geladen…

Fügen Sie eine Build-Einschränkung hinzu, die Windows AUSSCHLIESST (verwenden Sie den Negationsoperator!).

Editor wird geladen…

Lösung nach 3 Versuchen verfügbar

Quiz#go.m9.l5.e3
Bereit

Welches Flag verwenden Sie, um zum Testzeitpunkt ein benutzerdefiniertes „Integration“-Tag zu aktivieren, das mit //go:build Integration deklariert wurde?

Go
$ go test -tags=???
Antwortoptionen