Przejdź do głównej treści
eLearner.app
Moduł 9 · Lekcja 5 z 545/50 w kursie~10 min
Lekcje modułu (5/5)

Ograniczenia i tagi budowania

Ograniczenia kompilacji (zwane także znacznikami kompilacji) umożliwiają kompilację pliku w oparciu o system operacyjny, architekturę, wersję Go lub niestandardowe znaczniki przekazywane w wierszu poleceń. Są używane w kodzie wieloplatformowym, wymagających plików testowych i podobnych scenariuszach.

Nowoczesna składnia: //go:build

Od wersji Go 1.17+ format kanoniczny to specjalny komentarz //go:build, umieszczany na górze pliku przed package, w osobnej linii, po której następuje pusta linia:

Go
//go:build linux

package main

// this file is built ONLY on Linux

Trzy absolutne zasady:

  1. Komentarz musi pojawić się przed package.
  2. Po nim musi nastąpić pusta linia.
  3. Żadnej spacji pomiędzy // i go:build (jest to wyzwalacz składniowy, a nie jakikolwiek komentarz).

Wyrażenia logiczne

Wyrażenie po //go:build akceptuje operatory logiczne:

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)

Najpopularniejsze wbudowane tagi:

  • OS: linux, darwin, windows, freebsd, js...
  • Architektura: amd64, arm64, 386, wasm...
  • Wersja Go: go1.20, darwin0... (prawda, jeśli wersja jest ≥).
  • darwin1: prawda, jeśli włączone jest cgo.

Wieloplatformowe: konwencja nazw plików

Oprócz wyraźnych tagów Go rozpoznaje sufiksy nazw plików jako ukryte ograniczenia kompilacji:

Code
db_linux.go         // linux only
db_windows.go       // windows only
db_linux_amd64.go   // linux/amd64 only

Jest to idiomatyczny wzorzec dla zależnych od platformy implementacji tego samego interfejsu (każdy plik definiuje te same funkcje za pomocą innego kodu).

Tagi niestandardowe: włączanie się do ciężkich testów

Tagi niestandardowe to dowolny identyfikator, który przekazujesz w wierszu poleceń:

Go
//go:build integration

package mypkg

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

Wykonanie:

Bash
go test -tags=integration ./...

Bez -tags=integration plik jest niewidoczny dla kompilatora (testy w nim nie istnieją dla go test). Jest to kanoniczny sposób oddzielenia testów jednostkowych (zawsze) od testów integracyjnych (na żądanie, może tylko w CI).

Stara składnia: // +build (przestarzała)

Przed wersją 1.17 formatem był // +build linux (zwróć uwagę na spację i to, że jest to +build, a nie go:build). Nadal jest obsługiwany w celu zapewnienia kompatybilności wstecznej, ale gofmt w Go 1.17+ dodaje oba, gdy znajdzie tylko stary:

Go
//go:build linux
// +build linux

package main

W przypadku nowych plików używaj wyłącznie nowoczesnego formularza //go:build.

Ćwiczenia

Ćwiczenie#go.m9.l5.e1
Próby: 0Ładowanie...

Na górze pliku dodaj ograniczenie kompilacji, które kompiluje go TYLKO w systemie Linux. Zapamiętaj pustą linię przed pakietem.

Ładowanie edytora...
Pokaż wskazówkę

Komentarz //go:build znajduje się PRZED pakietem, w osobnej linii, po której następuje pusta linia.

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#go.m9.l5.e2
Próby: 0Ładowanie...

Dodaj ograniczenie kompilacji WYŁĄCZAJĄCE system Windows (użyj operatora negacji!).

Ładowanie edytora...

Rozwiązanie dostępne po 3 próbach

Quiz#go.m9.l5.e3
Gotowe

Aby włączyć w czasie testu niestandardowy tag „integracja” zadeklarowany za pomocą integracji //go:build, jakiej flagi używasz?

Go
$ go test -tags=???
Opcje odpowiedzi