Pelajaran modul (5/5)
Bangun batasan dan tag
Batasan build (juga disebut tag build) membuka kompilasi file berdasarkan OS, arsitektur, versi Go, atau tag khusus yang diteruskan pada baris perintah. Mereka digunakan untuk kode lintas platform, ikut serta dalam file pengujian berat, dan skenario serupa.
Sintaks modern: //go:build
Sejak Go 1.17+, format kanonisnya adalah komentar khusus //go:build, ditempatkan di bagian atas file sebelum package, pada baris tersendiri, diikuti dengan baris kosong:
//go:build linux
package main
// this file is built ONLY on LinuxTiga aturan mutlak:
- Komentar harus muncul sebelum
package. - Harus diikuti dengan baris kosong.
- Tidak ada spasi antara
//dango:build(ini adalah pemicu sintaksis, bukan sembarang komentar).
Ekspresi Boolean
Ekspresi setelah //go:build menerima operator logika:
//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)Tag bawaan yang paling umum:
- OS:
linux,darwin,windows,freebsd,js... - Arsitektur:
amd64,arm64,386,wasm... - Versi Go:
go1.20,go1.22... (benar jika versinya adalah ≥). cgo: benar jika cgo diaktifkan.
Lintas platform: konvensi nama file
Selain tag eksplisit, Go juga mengenali akhiran nama file sebagai batasan build implisit:
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
Ini adalah pola idiomatis untuk implementasi antarmuka yang sama yang bergantung pada platform (setiap file mendefinisikan fungsi yang sama dengan kode berbeda).
Tag khusus: ikut serta dalam pengujian berat
Tag khusus adalah pengidentifikasi apa pun yang Anda berikan pada baris perintah:
//go:build integration
package mypkg
// tests that need a real DB, run only on demandEksekusi:
go test -tags=integration ./...Tanpa -tags=integration, file tidak terlihat oleh kompiler (tes di dalamnya tidak ada untuk go test). Ini adalah cara kanonik untuk memisahkan pengujian unit (selalu) dari pengujian integrasi (sesuai permintaan, mungkin hanya di CI).
Sintaks lama: // +build (tidak digunakan lagi)
Sebelum 1.17, formatnya adalah // +build linux (perhatikan spasinya, dan formatnya adalah +build, bukan go:build). Ini masih didukung untuk kompatibilitas mundur, tetapi gofmt di Go 1.17+ menambahkan keduanya ketika hanya menemukan yang lama:
//go:build linux
// +build linux
package mainUntuk file baru hanya gunakan formulir //go:build modern.
Latihan
Di bagian atas file tambahkan batasan build yang mengkompilasinya HANYA di Linux. Ingat baris kosong sebelum paket.
Tunjukkan petunjuk
Komentar //go:build ditempatkan SEBELUM paket, pada satu baris tersendiri, diikuti dengan baris kosong.
Solusi tersedia setelah 3 upaya
Tambahkan batasan build yang TIDAK TERMASUK Windows (gunakan operator negasi!).
Solusi tersedia setelah 3 upaya
Untuk mengaktifkan tag 'integrasi' khusus yang dideklarasikan dengan //go:build integrasi pada waktu pengujian, tanda apa yang Anda gunakan?
$ go test -tags=???