モジュールのレッスン (5/5)
制約とタグを構築する
ビルド制約 (ビルド タグとも呼ばれます) は、OS、アーキテクチャ、Go バージョン、またはコマンド ラインで渡されたカスタム タグに基づいて ファイルのコンパイル をゲートします。これらは、クロスプラットフォーム コード、重いテスト ファイルのオプトイン、および同様のシナリオに使用されます。
最新の構文: //go:build
Go 1.17 以降では、正規の形式は特別な //go:build コメントであり、ファイルの先頭 package よりも前の 1 行に配置され、その後に空行が続きます。
//go:build linux
package main
// this file is built ONLY on Linux3 つの絶対的なルール:
- コメントは
packageの前に指定する必要があります。 - その後には空行を続ける必要があります。
//とgo:buildの間にスペースは入れません (これは単なるコメントではなく、構文上のトリガーです)。
ブール式
//go:build の後の式は論理演算子を受け入れます。
//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)最も一般的な組み込みタグ:
- OS:
linux、darwin、windows、freebsd、js... - アーキテクチャ:
amd64、arm64、386、wasm... - Go バージョン:
go1.20、go1.22... (バージョン が ≥ の場合は true)。 cgo: cgo が有効な場合は true。
クロスプラットフォーム: ファイル名の規則
明示的なタグを超えて、Go は ファイル名のサフィックス を暗黙的なビルド制約として認識します。
db_linux.go // linux only
db_windows.go // windows only
db_linux_amd64.go // linux/amd64 only
これは、同じインターフェイスのプラットフォーム依存実装の慣用的なパターンです (各ファイルは、異なるコードで同じ関数を定義します)。
カスタムタグ: 重いテストへのオプトイン
カスタム タグは、コマンドラインで渡す任意の識別子です。
//go:build integration
package mypkg
// tests that need a real DB, run only on demand実行:
go test -tags=integration ./...-tags=integration がないと、ファイルはコンパイラーには見えません (go test にはファイル内のテストが存在しません)。これは、単体テストを (常に) 統合テスト (オンデマンド、おそらく CI のみ) から分離する標準的な方法です。
古い構文: // +build (非推奨)
1.17 より前の形式は // +build linux でした (スペースと、go:build ではなく +build であることに注意してください)。下位互換性のために引き続きサポートされていますが、Go 1.17 以降の gofmt は、古いもののみが見つかった場合に 両方 を追加します。
//go:build linux
// +build linux
package main新しいファイルの場合は、最新の //go:build フォームのみを使用してください。
演習
ファイルの先頭に、Linux 上でのみコンパイルするビルド制約を追加します。パッケージの前の空行を覚えておいてください。
ヒントを表示
//go:build コメントはパッケージの前に 1 行で記述され、その後に空行が続きます。
3 回の試行後に解決策が利用可能になります
Windows を除外するビルド制約を追加します (否定演算子 ! を使用します)。
3 回の試行後に解決策が利用可能になります
//go:build 統合で宣言されたカスタムの「統合」タグをテスト時に有効にするには、どのフラグを使用しますか?
$ go test -tags=???