Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 16130] ファイルの概要

このコミットは、Go言語のバージョン1.1で導入されたビルドタグ go1.1 のドキュメント化と、そのビルドシステムへの組み込みに関するものです。具体的には、go1.1 ビルドタグの利用方法を公式ドキュメント doc/go1.1.html に追加し、Goのビルド制約に関する内部ドキュメント src/pkg/go/build/doc.gogo1.1 タグを明記しています。これにより、開発者はGo 1.1以降のバージョンに特化したコードを記述しつつ、それ以前のバージョンとの互換性を維持できるようになります。

コミット

commit 78c4d50d250215cd99f8e56525a8c9cc0c092f63
Author: Andrew Gerrand <adg@golang.org>
Date:   Mon Apr 8 11:41:01 2013 +1000

    doc: document go1.1 build tag
    
    Fixes #5235.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/8426048

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/78c4d50d250215cd99f8e56525a8c9cc0c092f63

元コミット内容

doc: document go1.1 build tag

Fixes #5235.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/8426048

変更の背景

Go言語は継続的に進化しており、新しいバージョンがリリースされるたびに新機能や改善が導入されます。しかし、これにより古いバージョンのGoで書かれたコードとの互換性の問題が生じる可能性があります。特に、新しいGoの機能を利用したいが、同時に古いGoのバージョンでも動作するライブラリやアプリケーションを開発する必要がある場合、条件付きコンパイルのメカニズムが不可欠となります。

このコミットが行われた2013年4月は、Go 1.1のリリースが間近に迫っていた時期です。Go 1.1では、パフォーマンスの向上、新しい標準ライブラリの追加、ツールチェインの改善など、多くの重要な変更が導入されました。これらの新機能を活用しつつ、Go 1.0.xなどの以前のバージョンとの互換性を維持するために、go1.1 という新しいビルドタグが導入されました。このコミットの目的は、この新しいビルドタグの存在と使用方法を公式にドキュメント化し、開発者がGoのバージョンに応じたコードの切り替えを容易に行えるようにすることでした。

具体的には、Go 1.1で導入される新機能を利用するコードを、Go 1.1以降の環境でのみコンパイルし、それ以前の環境ではコンパイルしない、あるいは代替のコードをコンパイルするといった柔軟な開発を可能にするための基盤を整えることが背景にあります。

前提知識の解説

このコミットを理解するためには、Go言語における「ビルドタグ(Build Tags)」または「ビルド制約(Build Constraints)」に関する知識が不可欠です。

ビルドタグ(Build Tags / Build Constraints)とは

Go言語のビルドシステムには、特定の条件に基づいてソースファイルをコンパイルに含めるか除外するかを制御するメカニズムがあります。これがビルドタグ(またはビルド制約)です。これは、ファイルの先頭に特別なコメント行を記述することで機能します。

基本的な書式は以下の通りです。

// +build tag1,tag2 !tag3

このコメント行は、Goのソースファイル(.go)、アセンブリファイル(.s)、C/C++ソースファイル(.c, .cc, .cpp)、Objective-Cソースファイル(.m)、Fortranソースファイル(.f, .for, .ftn)の先頭に記述できます。

  • +build ディレクティブは、そのファイルがコンパイルされるための条件を指定します。
  • タグはカンマで区切ることでAND条件(tag1 AND tag2)として機能します。
  • スペースで区切ることでOR条件(tag1 OR tag2)として機能します。
  • タグの前に ! を付けると、そのタグが存在しない場合にコンパイルされるという否定条件になります。

例えば、

  • // +build linux:Linux環境でのみコンパイルされる。
  • // +build darwin,amd64:macOS (Darwin) かつ AMD64アーキテクチャでのみコンパイルされる。
  • // +build !windows:Windows以外の環境でコンパイルされる。

Goのビルドシステムは、デフォルトでいくつかのタグを認識します。これには、オペレーティングシステム(linux, windows, darwinなど)、アーキテクチャ(amd64, arm, 386など)、Goのバージョン(go1.1, go1.2など)、コンパイラ(gc, gccgo)、Cgoの有効/無効(cgo)などが含まれます。

開発者は、go build -tags "mytag" のように -tags フラグを使用してカスタムタグを指定することもできます。

条件付きコンパイルの重要性

ビルドタグは、以下のようなシナリオで非常に重要です。

  1. プラットフォーム固有のコード: OSやアーキテクチャに依存するAPIを使用する場合、それぞれのプラットフォームに特化した実装を異なるファイルに記述し、ビルドタグで切り替えることができます。
  2. Goバージョン間の互換性: 新しいGoのバージョンで導入された機能を利用しつつ、古いバージョンでも動作するコードベースを維持する場合。このコミットで導入された go1.1 タグがまさにこの目的のために使われます。
  3. 開発/テスト/本番環境の切り替え: 特定の環境でのみ有効なコード(例: デバッグログ、モック実装)をビルドタグで切り替えることができます。
  4. 外部ライブラリの依存関係: 特定の外部ライブラリが特定の環境でのみ利用可能な場合、そのライブラリに依存するコードをビルドタグで制御できます。

このコミットは、Goのバージョンに基づく条件付きコンパイルを可能にする go1.1 タグを公式にサポートし、その利用方法を開発者に明確に伝えることを目的としています。

技術的詳細

このコミットは、Go 1.1のリリースに伴い、go1.1 ビルドタグをGoのビルドシステムに正式に組み込み、その使用方法を開発者向けにドキュメント化するものです。

go1.1 ビルドタグの導入

Goのビルドシステムは、コンパイル時に現在のGoのバージョンに基づいて特定のビルドタグを自動的に有効にします。Go 1.1以降の環境では、go1.1 タグが自動的に有効になるように内部的に設定されます。これにより、開発者はGoのバージョンを明示的にチェックする複雑なロジックをコードに書くことなく、ビルドタグのコメント行だけで条件付きコンパイルを実現できます。

ドキュメントの更新

コミットの主要な変更点は、以下の2つのファイルに対するドキュメントの更新です。

  1. doc/go1.1.html:

    • このファイルはGo 1.1のリリースノートや新機能の概要をまとめた公式ドキュメントです。
    • コミットでは、このファイルに「Build constraints」という新しいセクションが追加されています。
    • このセクションでは、go1.1 タグがデフォルトのビルド制約のリストに追加されたことが明記されています。
    • Go 1.1以降でのみファイルをビルドするための // +build go1.1 の使用例が示されています。
    • Go 1.0.xでのみファイルをビルドするための // +build !go1.1 という逆の制約の使用例も示されています。これは、go1.1 タグが有効でない(つまりGo 1.0.xのような古いバージョンである)場合にコンパイルされることを意味します。
  2. src/pkg/go/build/doc.go:

    • このファイルは、Goの標準ライブラリ go/build パッケージの内部ドキュメントであり、Goのビルド制約がどのように機能するかを説明しています。
    • コミットでは、このドキュメント内の「デフォルトで認識されるビルドタグのリスト」に "go1.1", from Go version 1.1 onward という記述が追加されています。
    • これにより、go/build パッケージを利用するツールや、Goのビルドシステム自体が go1.1 タグを公式なバージョンタグとして認識することが明確になります。

これらの変更により、Go 1.1の新機能を利用するコードを、Go 1.1以降の環境でのみコンパイルし、それ以前の環境ではコンパイルしない、あるいは代替のコードをコンパイルするといった柔軟な開発が可能になります。これは、ライブラリ開発者がGoの新しい機能を採用しつつ、既存のユーザーベースとの互換性を維持する上で非常に重要なメカニズムとなります。

コアとなるコードの変更箇所

このコミットは主にドキュメントの追加と修正であり、Goのランタイムやコンパイラのコアロジックに直接的な変更を加えるものではありません。しかし、Goのビルドシステムが go1.1 タグを認識するように内部的に設定されていることを前提として、その利用方法を開発者に伝えるための重要な変更です。

変更されたファイルは以下の2つです。

  1. doc/go1.1.html
  2. src/pkg/go/build/doc.go

doc/go1.1.html の変更

--- a/doc/go1.1.html
+++ b/doc/go1.1.html
@@ -403,6 +403,31 @@ command now returns an error if test files are provided on the command line. In
 this sense, "<code>go run</code>" replaces "<code>go run *.go</code>".
 </p>
 
+<h3 id=\"tags\">Build constraints</h3>
+
+<p>
+The <code>\"go1.1</code>\" tag has been added to the list of default
+<a href=\"/pkg/go/build/#hdr-Build_Constraints\">build constraints</a>.
+This permits packages to take advanage of the new features in Go 1.1 while
+remaining compatible with earlier versions of Go.
+</p>
+
+<p>
+To build a file only with Go 1.1 and above, add this build constraint:
+</p>
+
+<pre>
+// +build go1.1
+</pre>
+
+<p>
+To build a file only with Go 1.0.x, use the converse constraint:
+</p>
+
+<pre>
+// +build !go1.1
+</pre>
+
 <h3 id=\"platforms\">Additional platforms</h3>
 
 <p>

src/pkg/go/build/doc.go の変更

--- a/src/pkg/go/build/doc.go
+++ b/src/pkg/go/build/doc.go
@@ -91,8 +91,9 @@
 //
 //
 //	- the target operating system, as spelled by runtime.GOOS
 //	- the target architecture, as spelled by runtime.GOARCH
 //	- the compiler being used, currently either "gc" or "gccgo"
 //	- "cgo", if ctxt.CgoEnabled is true
 //	- "go1.1", from Go version 1.1 onward
 //	- any additional words listed in ctxt.BuildTags
 //
 // If a file\'s name, after stripping the extension and a possible _test suffix,

コアとなるコードの解説

doc/go1.1.html の変更点

この変更は、Go 1.1の公式ドキュメントに「Build constraints」という新しいセクションを追加しています。

  • h3 id="tags">Build constraints</h3>: 新しいセクションの見出しです。id="tags" は、このセクションへの内部リンクを可能にします。
  • The <code>\"go1.1</code>\" tag has been added to the list of default <a href=\"/pkg/go/build/#hdr-Build_Constraints\">build constraints</a>.: go1.1 タグがデフォルトのビルド制約のリストに追加されたことを明確に述べています。go/build パッケージのビルド制約に関するドキュメントへのリンクも提供されています。
  • This permits packages to take advanage of the new features in Go 1.1 while remaining compatible with earlier versions of Go.: go1.1 タグの導入目的を説明しています。Go 1.1の新機能を活用しつつ、以前のGoバージョンとの互換性を維持できる点が強調されています。
  • To build a file only with Go 1.1 and above, add this build constraint: // +build go1.1: Go 1.1以降のバージョンでのみコンパイルされるコードの記述方法を示しています。これは、Go 1.1で導入された特定のAPIや機能を使用する際に役立ちます。
  • To build a file only with Go 1.0.x, use the converse constraint: // +build !go1.1: Go 1.0.xのような古いバージョンでのみコンパイルされるコードの記述方法を示しています。! プレフィックスは否定を意味し、go1.1 タグが有効でない場合にこのファイルがコンパイルされることを示します。これは、Go 1.1で非推奨になった機能や、Go 1.1で変更された動作に対応するための代替コードを提供する場合に有用です。

このドキュメントの追加により、Go開発者はGo 1.1のリリースと同時に、バージョン固有のコードを効果的に管理するための公式なガイダンスを得られるようになりました。

src/pkg/go/build/doc.go の変更点

この変更は、Goのビルドシステムが認識するデフォルトのビルドタグのリストに go1.1 を追加するものです。

  • - the compiler being used, currently either "gc" or "gccgo": 既存の行から "currently" が削除されています。これは、コンパイラのリストが常に最新であるとは限らないため、より一般的な表現に修正されたと考えられます。
  • + - the compiler being used, either "gc" or "gccgo": 上記の修正後の行です。
  • + - "go1.1", from Go version 1.1 onward: この行が追加された最も重要な変更点です。これにより、go/build パッケージのドキュメントにおいて、go1.1 がGo 1.1以降のバージョンで自動的に有効になるビルドタグとして公式にリストアップされました。これは、Goのツールチェインがこのタグを認識し、適切に処理するための内部的な整合性を保つ上で重要です。

この変更は、Goのビルドシステムが go1.1 タグをバージョンベースの制約として認識し、それに基づいてファイルのコンパイルを制御するための基盤を強化します。

関連リンク

  • Go 1.1 Release Notes: https://go.dev/doc/go1.1 (このコミットで更新された doc/go1.1.html の内容が含まれる)
  • Go Build Constraints (公式ドキュメント): https://go.dev/pkg/go/build/#hdr-Build_Constraints
  • Go Issue 5235: go.googlecode.com/p/go/issues/detail?id=5235 (コミットメッセージで参照されているIssue。現在はGoのIssueトラッカーがGitHubに移行しているため、直接アクセスできない可能性がある)

参考にした情報源リンク

  • Go言語公式ドキュメント
  • Go言語のソースコード (特に go/build パッケージ)
  • Go言語のリリースノート
  • Go言語のビルドタグに関する一般的な解説記事 (Web検索による)