Ana içeriğe geç
Modül 9 · Ders 5 ders 5Kurstaki 45/50~10 min
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
//go:build linux

package main

// this file is built ONLY on Linux

Üç mutlak kural:

  1. Yorum package'den önce görünmelidir.
  2. Ardından boş bir satır gelmelidir.
  3. // ve go:build arası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
//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:

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

package mypkg

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

Uygulamak:

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

package main

Yeni dosyalar için yalnızca modern //go:build formunu kullanın.

Egzersizler

Egzersiz#go.m9.l5.e1
Denemeler: 0Yükleniyor…

Dosyanın en üstüne onu YALNIZCA Linux'ta derleyen derleme kısıtlamasını ekleyin. Paketten önceki boş satırı unutmayın.

Düzenleyici yükleniyor…
İ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

Egzersiz#go.m9.l5.e2
Denemeler: 0Yükleniyor…

Windows'u HARİÇ TUTACAK bir yapı kısıtlaması ekleyin (olumsuzlama operatörünü kullanın!).

Düzenleyici yükleniyor…

3 denemeden sonra çözüm mevcut

Quiz#go.m9.l5.e3
Hazır

Test zamanında //go:build entegrasyonuyla bildirilen özel bir 'entegrasyon' etiketini etkinleştirmek için hangi bayrağı kullanıyorsunuz?

Go
$ go test -tags=???
Cevap seçenekleri