Citando dalla documentazione build constraints:
Un vincolo build è una riga di commento che inizia con la direttiva + build che elenca le condizioni in cui un file deve essere incluso nel pacchetto. I vincoli possono apparire in qualsiasi tipo di file sorgente (non solo Go), ma devono comparire in cima al file, preceduti solo da righe vuote e altri commenti di riga.
Per distinguere i vincoli di compilazione dalla documentazione del pacchetto, una serie di vincoli di costruzione deve essere seguita da una riga vuota.
Un vincolo di compilazione viene valutato come OR delle opzioni separate dallo spazio; ogni opzione valuta come AND dei suoi termini separati da virgole; e ogni termine è una parola alfanumerica o, preceduta da!, la sua negazione. Cioè, il vincolo di costruzione:
// +build linux,386 darwin,!cgo
corrisponde alla formula booleana:
(linux AND 386) OR (darwin AND (NOT cgo))
Un file può avere più vincoli di compilazione. Il vincolo generale è l'AND dei vincoli individuali. Cioè, i vincoli di build:
// +build linux darwin
// +build 386
corrisponde alla formula booleana:
(linux OR darwin) AND 386
durante una particolare costruzione, le seguenti parole sono soddisfatti:
- il sistema operativo di destinazione, come chiaramente dalla runtime.GOOS
- l'architettura target, come chiaramente dalla runtime.GOARCH
- il compilatore in uso, viene "gc" o "gccgo"
- "CGO", se ctxt.CgoEnabled è true
- "go1.1", da Go versione 1.1 in poi
- eventuali ulteriori parole elencate ctxt.BuildTags
Se il nome di un file, dopo la rimozione del prolungamento e le possibili suffissi _test, corrisponde a uno dei seguenti modelli:
*_GOOS
*_GOARCH
*_GOOS_GOARCH
(esempio: source_windows_amd64.go) o letterali:
GOOS
GOARCH
(esempio: windows.go) dove GOOS e GOARCH rappresentano rispettivamente qualsiasi sistema operativo noto e valori architettura, il file è considerato avere un vincolo accumulo implicito da tali termini.
Per conservare un file venga preso in considerazione per la compilazione:
// +build ignore
(qualsiasi altra parola insoddisfatta funziona così, ma “ignora” è convenzionale.)
Per costruire un file solo quando si utilizza cgo e solo su Linux e OS X:
// +build linux,cgo darwin,cgo
Tale file viene generalmente accoppiato con un altro file attuare la funzionalità predefinita per altri sistemi, che in questo caso sarebbe portare il vincolo:
// +build !linux,!darwin !cgo
Denominazione di un file di dns_windows.go ne causa da includere solo quando si crea il pacchetto per Windows; allo stesso modo, math_386.s sarà incluso solo quando si costruisce il pacchetto per x86 a 32 bit.