//go:build と // build の違い
Go 1.17 では、//go:build という名前の新しい条件付きコンパイル ディレクティブが、古い // build ディレクティブ。どちらのディレクティブもビルド制約を指定するという同じ目的を果たしますが、//go:build.
構文の違い:
- //go:build を使用することにはいくつかの重要な違いと利点があります。 //go:generate など、他の Go ディレクティブと同様の構文に従います。これは引数としてブール式を受け取り、コンパイル中にファイルをパッケージに含めるかどうかを決定します。
- // 一方、build はあまり直感的ではない構文を使用します。ファイルを含めるプラットフォームまたは条件を指定するタグのカンマ区切りリストを受け入れます。
実装の詳細:
- Go バージョン 1.17 以降では、 // go:build は優先ディレクティブであり、Go 1.18 リリースで説明されているように、ツールチェーンによって積極的に削除されます。 Notes.
- // スムーズな移行を確保するために、ビルドはいくつかの Go リリースで引き続きサポートされますが、新しいバージョンではその使用は推奨されません。
//go の利点:build:
-
一貫性: //go:build は Go の他のディレクティブやプラグマと一致しており、一貫性があり覚えやすくなっています。
-
改善された構文: //go:build は、以下を使用する、より標準的なブール式構文を提供します。 & と ||それぞれ AND 条件と OR 条件の場合。これは、AND にカンマを使用し、OR にスペースを使用した // build とは対照的です。
-
Go fmt Support: //go:build は go fmt によってサポートされており、誤ったものは自動的に修正されます。ソースファイル内のディレクティブの配置。これは、ディレクティブとパッケージ ステートメントの間に空白行を残さないなど、よくある間違いを避けるのに役立ちます。
-
詳細なエラー メッセージ: //go:build は、コンパイル中にさらに詳細なエラー メッセージを提供します。ビルド制約に関する問題を特定するのに役立ちます。
使用法:
両方ディレクティブはビルド制約を指定するために使用されますが、その利点により、通常は //go:build が好まれます。両方のディレクティブの使用法を示す例を次に示します。
//go:build linux && amd64
package main
// +build linux,amd64
package main
この例では、両方のディレクティブは同じ結果を達成します。つまり、Linux および 64 ビット AMD アーキテクチャ用にコンパイルする場合にのみメイン パッケージがインクルードされます。
結論:
//go:build には、// build に比べて、一貫性のあるものなど、いくつかの利点があります。構文、改善されたエラー メッセージ、および go fmt サポート。これは、Go 1.17 以降でビルド制約を指定する場合に推奨されるディレクティブです。
以上がGo の条件付きコンパイルにおける `//go:build` と `// build` の主な違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。