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:build linux
package main
// this file is built ONLY on LinuxTrzy absolutne zasady:
- Komentarz musi pojawić się przed
package. - Po nim musi nastąpić pusta linia.
- Żadnej spacji pomiędzy
//igo:build(jest to wyzwalacz składniowy, a nie jakikolwiek komentarz).
Wyrażenia logiczne
Wyrażenie po //go:build akceptuje operatory logiczne:
//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:
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:build integration
package mypkg
// tests that need a real DB, run only on demandWykonanie:
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:build linux
// +build linux
package mainW przypadku nowych plików używaj wyłącznie nowoczesnego formularza //go:build.
Ćwiczenia
Na górze pliku dodaj ograniczenie kompilacji, które kompiluje go TYLKO w systemie Linux. Zapamiętaj pustą linię przed pakietem.
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
Dodaj ograniczenie kompilacji WYŁĄCZAJĄCE system Windows (użyj operatora negacji!).
Rozwiązanie dostępne po 3 próbach
Aby włączyć w czasie testu niestandardowy tag „integracja” zadeklarowany za pomocą integracji //go:build, jakiej flagi używasz?
$ go test -tags=???