Lompati ke konten utama
Modul 9 · Pelajaran 5 dari 545/50 dalam kursus~10 min
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
//go:build linux

package main

// this file is built ONLY on Linux

Tiga aturan mutlak:

  1. Komentar harus muncul sebelum package.
  2. Harus diikuti dengan baris kosong.
  3. Tidak ada spasi antara // dan go:build (ini adalah pemicu sintaksis, bukan sembarang komentar).

Ekspresi Boolean

Ekspresi setelah //go:build menerima operator logika:

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)

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:

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

package mypkg

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

Eksekusi:

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

package main

Untuk file baru hanya gunakan formulir //go:build modern.

Latihan

Latihan#go.m9.l5.e1
Upaya: 0Memuat…

Di bagian atas file tambahkan batasan build yang mengkompilasinya HANYA di Linux. Ingat baris kosong sebelum paket.

Memuat editor…
Tunjukkan petunjuk

Komentar //go:build ditempatkan SEBELUM paket, pada satu baris tersendiri, diikuti dengan baris kosong.

Solusi tersedia setelah 3 upaya

Latihan#go.m9.l5.e2
Upaya: 0Memuat…

Tambahkan batasan build yang TIDAK TERMASUK Windows (gunakan operator negasi!).

Memuat editor…

Solusi tersedia setelah 3 upaya

Quiz#go.m9.l5.e3
Siap

Untuk mengaktifkan tag 'integrasi' khusus yang dideklarasikan dengan //go:build integrasi pada waktu pengujian, tanda apa yang Anda gunakan?

Go
$ go test -tags=???
Pilihan jawaban