Modül dersleri (5/5)
Kısıtlamalar ve etiketler oluşturun
Derleme kısıtlamaları (derleme etiketleri olarak da bilinir), işletim sistemine, mimariye, Go sürümüne veya komut satırında iletilen özel etiketlere göre bir dosyanın derlenmesine geçit verir. Platformlar arası kod, isteğe bağlı ağır test dosyaları ve benzer senaryolar için kullanılırlar.
Modern sözdizimi: //go:build
Go 1.17+ sürümünden bu yana kanonik format, dosyanın en üstüne package'den önce, tek başına bir satıra ve ardından boş bir satıra yerleştirilen özel //go:build yorumudur:
//go:build linux
package main
// this file is built ONLY on LinuxÜç mutlak kural:
- Yorum
package'den önce görünmelidir. - Ardından boş bir satır gelmelidir.
//vego:buildarasında boşluk yok (bu, herhangi bir yorum değil, sözdizimsel bir tetikleyicidir).
Boole ifadeleri
//go:build'dan sonraki ifade mantıksal operatörleri kabul eder:
//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)En yaygın yerleşik etiketler:
- İşletim Sistemi:
linux,darwin,windows,freebsd,js... - Mimarlık:
amd64,arm64,386,wasm... - Sürüme git:
go1.20,go1.22... (sürüm ≥ ise doğrudur). cgo: cgo etkinse doğrudur.
Platformlar arası: dosya adı kuralı
Açık etiketlerin ötesinde Go, dosya adı son eklerini örtülü derleme kısıtlamaları olarak tanır:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
Aynı arayüzün platforma bağlı uygulamalarına yönelik deyimsel kalıptır (her dosya aynı işlevleri farklı kodla tanımlar).
Özel etiketler: ağır testlere katılma
Özel etiketler komut satırında ilettiğiniz herhangi bir tanımlayıcıdır:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandUygulamak:
go test -tags=integration ./...-tags=integration olmadan dosya derleyici tarafından görülemez (içindeki testler go test için mevcut değildir). Birim testlerini (her zaman) entegrasyon testlerinden (talep üzerine, belki yalnızca CI'de) ayırmanın kanonik yoludur.
Eski sözdizimi: // +build (kullanımdan kaldırıldı)
1.17'den önce format // +build linux idi (boşluğa ve go:build değil, +build olduğuna dikkat edin). Geriye dönük uyumluluk açısından hâlâ desteklenmektedir, ancak Go 1.17+ sürümündeki gofmt yalnızca eskisini bulduğunda her ikisini de ekler:
//go:build linux
// +build linux
package mainYeni dosyalar için yalnızca modern //go:build formunu kullanın.
Egzersizler
Dosyanın en üstüne onu YALNIZCA Linux'ta derleyen derleme kısıtlamasını ekleyin. Paketten önceki boş satırı unutmayın.
İpucu göster
//go:build yorumu paketten ÖNCE tek başına bir satırda ve ardından boş bir satırla gelir.
3 denemeden sonra çözüm mevcut
Windows'u HARİÇ TUTACAK bir yapı kısıtlaması ekleyin (olumsuzlama operatörünü kullanın!).
3 denemeden sonra çözüm mevcut
Test zamanında //go:build entegrasyonuyla bildirilen özel bir 'entegrasyon' etiketini etkinleştirmek için hangi bayrağı kullanıyorsunuz?
$ go test -tags=???