メインコンテンツにスキップ
モジュール 9 · レッスン 5 / 5コース内の 45/50~10 min
モジュールのレッスン (5/5)

制約とタグを構築する

ビルド制約 (ビルド タグとも呼ばれます) は、OS、アーキテクチャ、Go バージョン、またはコマンド ラインで渡されたカスタム タグに基づいて ファイルのコンパイル をゲートします。これらは、クロスプラットフォーム コード、重いテスト ファイルのオプトイン、および同様のシナリオに使用されます。

最新の構文: //go:build

Go 1.17 以降では、正規の形式は特別な //go:build コメントであり、ファイルの先頭 package よりも前の 1 行に配置され、その後に空行が続きます。

Go
//go:build linux

package main

// this file is built ONLY on Linux

3 つの絶対的なルール:

  1. コメントは package の前に指定する必要があります。
  2. その後には空行を続ける必要があります。
  3. // と go:build の間にスペースは入れません (これは単なるコメントではなく、構文上のトリガーです)。

ブール式

//go:build の後の式は論理演算子を受け入れます。

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)

最も一般的な組み込みタグ:

  • OS: linux、darwin、windows、freebsd、js...
  • アーキテクチャ: amd64、arm64、386、wasm...
  • Go バージョン: go1.20、go1.22... (バージョン が ≥ の場合は true)。
  • cgo: cgo が有効な場合は true。

クロスプラットフォーム: ファイル名の規則

明示的なタグを超えて、Go は ファイル名のサフィックス を暗黙的なビルド制約として認識します。

Code
db_linux.go         // linux only
db_windows.go       // windows only
db_linux_amd64.go   // linux/amd64 only

これは、同じインターフェイスのプラットフォーム依存実装の慣用的なパターンです (各ファイルは、異なるコードで同じ関数を定義します)。

カスタムタグ: 重いテストへのオプトイン

カスタム タグは、コマンドラインで渡す任意の識別子です。

Go
//go:build integration

package mypkg

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

実行:

Bash
go test -tags=integration ./...

-tags=integration がないと、ファイルはコンパイラーには見えません (go test にはファイル内のテストが存在しません)。これは、単体テストを (常に) 統合テスト (オンデマンド、おそらく CI のみ) から分離する標準的な方法です。

古い構文: // +build (非推奨)

1.17 より前の形式は // +build linux でした (スペースと、go:build ではなく +build であることに注意してください)。下位互換性のために引き続きサポートされていますが、Go 1.17 以降の gofmt は、古いもののみが見つかった場合に 両方 を追加します。

Go
//go:build linux
// +build linux

package main

新しいファイルの場合は、最新の //go:build フォームのみを使用してください。

演習

運動#go.m9.l5.e1
試行回数: 0読み込み中…

ファイルの先頭に、Linux 上でのみコンパイルするビルド制約を追加します。パッケージの前の空行を覚えておいてください。

エディターを読み込み中…
ヒントを表示

//go:build コメントはパッケージの前に 1 行で記述され、その後に空行が続きます。

3 回の試行後に解決策が利用可能になります

運動#go.m9.l5.e2
試行回数: 0読み込み中…

Windows を除外するビルド制約を追加します (否定演算子 ! を使用します)。

エディターを読み込み中…

3 回の試行後に解決策が利用可能になります

Quiz#go.m9.l5.e3
準備完了

//go:build 統合で宣言されたカスタムの「統合」タグをテスト時に有効にするには、どのフラグを使用しますか?

Go
$ go test -tags=???
回答の選択肢