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

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

このコミットは、Go言語のバージョン1.1のリリースノートドキュメントである doc/go1.1.html ファイルに対する更新です。具体的には、既存のテキストにリンクを追加し、Go 1.1で導入された言語、実装、ツール、および標準ライブラリの変更点に関する新しいセクションを書き加えています。

コミット

commit ee5a794fbbde0bc608f91e974a9b12f887b8266c
Author: Rob Pike <r@golang.org>
Date:   Tue Mar 19 16:40:19 2013 -0700

    doc/go1.1.html: add links to the text, write some new sections
    
    R=golang-dev, rsc, dave
    CC=golang-dev
    https://golang.org/cl/7914043

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

https://github.com/golang/go/commit/ee5a794fbbde0bc608f91e974a9b12f887b8266c

元コミット内容

doc/go1.1.html ファイルが変更され、156行が追加され、48行が削除されました。この変更は、Go 1.1のリリースノートに、言語の変更点、実装とツールの変更点、および標準ライブラリの変更点に関する詳細な説明と内部リンクを追加することを目的としています。

変更の背景

このコミットの背景には、Go 1.1のリリースが控えており、その新機能や変更点をユーザーに正確かつ包括的に伝える必要があったことが挙げられます。Go 1.1は、Go 1のリリース後初のメジャーアップデートであり、言語仕様の厳密化、パフォーマンスの向上、ツールの改善、標準ライブラリの機能拡張など、多岐にわたる変更が含まれていました。これらの変更点を網羅した公式ドキュメントは、開発者がGo 1.1へスムーズに移行し、新機能を活用するために不可欠です。

特に、Go言語は「Go 1互換性ドキュメント」でGo 1言語仕様で書かれたプログラムが引き続き動作することを約束しており、このコミットは、その約束を維持しつつ、仕様の厳密化や新しい言語機能に関する詳細を明確に伝える役割を担っています。

前提知識の解説

このコミット内容を理解するためには、以下のGo言語に関する基本的な知識が前提となります。

  • Go言語のバージョン管理と互換性: Go言語はGo 1以降、後方互換性を非常に重視しています。Go 1.1はGo 1の互換性保証を維持しつつ、機能追加や改善が行われました。
  • Goのツールチェイン: go build, go get, go fix など、Go言語の開発をサポートするコマンドラインツール群の基本的な役割。
  • Goの標準ライブラリ: net, time, debug/elf など、Go言語に標準で提供されるパッケージの基本的な機能。
  • Goの型システム: int, uint などの整数型、およびそれらのプラットフォーム依存のサイズに関する知識。
  • Unicodeとサロゲートペア: Unicode文字エンコーディング、特にUTF-16におけるサロゲートペアの概念。
  • ELF (Executable and Linkable Format): Unix系システムで実行可能ファイル、オブジェクトファイル、共有ライブラリなどに用いられるファイル形式。debug/elf パッケージはこれを扱うためのものです。
  • GOROOTGOPATH: Goのワークスペースを構成する重要な環境変数。GOROOT はGoのインストールディレクトリを指し、GOPATH はユーザーのGoプロジェクトのワークスペースを指します。

技術的詳細

このコミットによって doc/go1.1.html に追加された主な技術的変更点と解説は以下の通りです。

  1. 言語の変更点:

    • 定数ゼロによる整数除算: Go 1.1では、定数ゼロによる整数除算はコンパイル時エラーとなるように明確化されました。Go 1.0では実行時パニックを引き起こす可能性がありました。
    • Unicodeリテラルにおけるサロゲート: 文字列リテラルおよびruneリテラルの定義が厳密化され、有効なUnicodeコードポイントのセットからサロゲートペアが除外されました。これは、UTF-16エンコーディングにおけるサロゲートペアが、Goのrune(Unicodeコードポイントを表す)としては不正な値であるという仕様の明確化です。
    • メソッド値: メソッド値に関するセクションが追加されました。これは、Go 1.1で導入された、メソッドを関数値として扱う機能に関する説明です。
    • return 要件: return ステートメントの要件に関するセクションが追加されました。
  2. 実装とツールの変更点:

    • 64ビットプラットフォームにおける int のサイズ: gc および gccgo コンパイラにおいて、64ビットプラットフォーム(AMD64/x86-64など)で int および uint 型が64ビット幅になるように変更されました。これにより、64ビットシステム上で20億以上の要素を持つスライスを割り当てることが可能になりました。この変更は、32ビットシステムと64ビットシステム間での移植性に関する考慮事項を伴います。
    • gc アセンブラ: int 型のサイズ変更やその他の変更により、gc ツールチェインにおけるスタック上の関数引数の配置が変更されました。アセンブリで書かれた関数は、フレームポインタのオフセットを調整する必要があることが明記されました。
    • go コマンドの変更:
      • パッケージが見つからない場合に、検索されたパスのリストを含むより詳細なエラーメッセージが表示されるようになりました。
      • go get コマンドが、パッケージソースのダウンロード先として GOROOT をデフォルトで許可しなくなりました。go get を使用するには、有効な GOPATH が必須となりました。
      • GOPATHGOROOT が同じ値に設定されている場合、go get コマンドが失敗するようになりました。これは、ユーザーが誤ってGoのインストールディレクトリに直接パッケージをダウンロードしてしまうことを防ぐための変更です。
    • go fix の変更: go fix コマンドが、Go 1以前のコードをGo 1 APIに更新するための修正を適用しなくなりました。Go 1.1に更新するには、まずGo 1.0ツールチェインを使用してコードをGo 1.0に変換する必要があることが示されました。
  3. 標準ライブラリの変更点:

    • debug/elf: debug/elf パッケージが、ELFシンボルテーブルの最初のシンボル(常に空のシンボル)をスキップしなくなりました。これにより、debug/elf が返すシンボルテーブルのインデックスが、元のELFシンボルテーブルのインデックスと異なる可能性があるため、SymbolsImportedSymbols 関数を呼び出すコードは調整が必要になる場合があります。
    • net:
      • net パッケージのプロトコル固有のリゾルバ(ResolveTCPAddr など)が、ネットワーク名に厳密なチェックを行うようになりました。以前は任意の文字列を受け入れていましたが、Go 1.1では tcp, tcp4, tcp6 などの有効な文字列でない場合はエラーを返します。
      • ListenUnixgram の以前の実装が UDPConn を返していたのに対し、Go 1.1では UnixConn を返すようになりました。これにより、UnixConnReadFrom および WriteTo メソッドを使用して読み書きが可能になります。
    • time:
      • FreeBSD, Linux, NetBSD, OS X, OpenBSDなどのシステムで、time パッケージがマイクロ秒精度からナノ秒精度で時刻を返すようになりました。これにより、外部ストレージにマイクロ秒精度で時刻を保存し、読み戻す際に元の時刻が正確に復元されない可能性があるため、time.Time の新しいメソッド RoundTruncate を使用して精度を調整する必要があることが示されました。
      • 新しいメソッド YearDay が追加され、時刻値が指定する年の1から始まる日番号を返します。
      • Timer 型に新しいメソッド Reset が追加され、タイマーが指定された期間後に期限切れになるように変更できるようになりました。
      • 新しい関数 ParseInLocation が追加され、既存の Parse と同様に動作しますが、ロケーション(タイムゾーン)のコンテキストで時刻を解析し、解析された文字列内のタイムゾーン情報を無視します。これは、time APIにおける一般的な混乱の原因に対処するためのものです。
  4. exp および old サブツリーの移動:

    • exp サブツリーが code.google.com/p/go.exp サブリポジトリに移動しました。これにより、バイナリディストリビューションがこれらの実験的なパッケージにアクセスしやすくなりました。
    • 古いパッケージ exp/normgo.text という新しいリポジトリに移動しました。この go.text リポジトリは、Unicode APIやその他のテキスト関連パッケージが開発される場所となります。

これらの変更は、Go 1.1がGo言語の成熟度を高め、より堅牢で使いやすいプラットフォームにするための重要なステップであったことを示しています。

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

このコミットは、Go言語のソースコード自体ではなく、Go 1.1のリリースノートドキュメントである doc/go1.1.html ファイルの変更に限定されています。したがって、「コアとなるコード」とは、このHTMLドキュメントのコンテンツそのものを指します。

変更の主な箇所は以下の通りです。

  • HTML構造の追加: 新しい h3 タグで始まるセクション(例: id="unicode_literals", id="method_values", id="return")が追加され、Go 1.1の言語変更点に関する説明の枠組みが作られました。
  • 既存セクションの拡張と詳細化:
    • id="language" セクションに、Go 1互換性ドキュメントへのリンクと、言語仕様の厳密化に関する説明が追加されました。
    • id="int" セクション(64ビットプラットフォームでの int サイズ)に、より詳細な説明とコード例が追加されました。
    • id="unicode_surrogates"id="unicode" に変更され、Unicodeに関する説明が拡充されました。
    • id="asm"id="gc_asm" に変更され、gc アセンブラに関する説明が詳細化されました。
    • id="gotool"id="gocmd" に変更され、go コマンドの変更点(パッケージ検索エラーメッセージ、go getGOPATH 必須化、GOPATHGOROOT の同一設定の禁止)が詳細に記述されました。
    • id="gofix" セクションに go fix コマンドの変更点が追加されました。
    • id="debug_elf", id="net", id="time" といった標準ライブラリのセクションが大幅に加筆修正され、Go 1.1でのAPI変更や振る舞いの変更が詳細に説明されました。
    • id="exp_old" セクションが id="exp_old" から id="exp_old" に変更され、go.exp および go.text サブリポジトリへの移動に関する説明が追加されました。
  • 内部リンクの追加: ドキュメント内の関連セクションへの <a> タグによる内部リンクが多数追加され、読者が関連情報を参照しやすくなりました。

これらの変更は、Go 1.1のリリースノートをより網羅的で理解しやすいものにするための、純粋なドキュメントの更新です。

コアとなるコードの解説

このコミットにおける「コアとなるコード」は、Go 1.1のリリースノートを記述したHTMLファイル doc/go1.1.html です。このファイルは、Go言語の公式ドキュメントの一部として、Go 1.1で導入された主要な変更点、新機能、および既存の振る舞いの修正について、開発者向けに情報を提供します。

具体的な変更内容の解説は以下の通りです。

  • HTML構造の改善とコンテンツの追加:
    • 以前は TODO となっていた箇所に、具体的なコンテンツが追加されました。例えば、言語の変更点に関するセクションでは、Go 1互換性ドキュメントへのリンクが追加され、Go 1.1での仕様の厳密化について言及されています。
    • <h3> タグで新しいサブセクションが多数追加されました。これには、「Surrogates in Unicode literals」(Unicodeリテラルにおけるサロゲート)、「Method values」(メソッド値)、「Return requirements」(return要件)など、Go 1.1で導入された言語機能や仕様の明確化に関する項目が含まれます。
  • 既存コンテンツの拡充と詳細化:
    • int 型のサイズ変更に関するセクションでは、32ビットシステムと64ビットシステムでの int の振る舞いの違いについて、より詳細な説明とコード例が追加されました。これにより、開発者が移植性の問題を理解しやすくなっています。
    • go コマンドの変更点については、パッケージが見つからない場合のエラーメッセージの改善、go getGOPATH を必須とするようになったこと、GOPATHGOROOT が同じ値に設定されている場合の挙動など、具体的な変更が詳細に記述されています。これにより、新しいGoユーザーが直面する可能性のある一般的な問題が明確化されています。
    • 標準ライブラリの変更点、特に net パッケージと time パッケージについては、APIの振る舞いの変更や新しいメソッド・関数の追加が詳細に説明されています。例えば、time パッケージのナノ秒精度への変更と、それに対応するための Round および Truncate メソッドの導入は、開発者が既存のコードを更新する際に重要な情報となります。
  • 内部リンクの活用:
    • ドキュメント内で関連するGoのパッケージドキュメント(例: /pkg/net/, /pkg/time/)や、特定の関数・メソッドのドキュメント(例: /pkg/net/#ResolveTCPAddr)へのリンクが多数追加されました。これにより、読者はリリースノートから直接、詳細なAPIドキュメントにアクセスできるようになり、情報の探索性が向上しています。
    • GoのIssueトラッカーへのリンク(例: http://golang.org/issue/2188)も追加されており、特定の変更の背景にある議論や決定プロセスを追跡できるようになっています。

このコミットは、Go 1.1のリリースノートを単なる変更点のリストではなく、Go 1.1の全体像と各変更の技術的詳細を深く掘り下げた、包括的なリファレンスドキュメントへと昇華させることを目的としています。これにより、Go開発者はGo 1.1への移行をよりスムーズに行い、新機能を最大限に活用できるようになります。

関連リンク

参考にした情報源リンク

  • Go 1.1 Release Notes (公式ドキュメント): このコミットによって更新されたドキュメントそのもの。
  • Go言語の公式GitHubリポジトリ: コミット履歴とソースコード。
  • Go言語の公式ブログやアナウンス: Go 1.1リリース時の公式発表。
  • Go言語のIssueトラッカー: 各変更の背景にある議論やバグ報告。
  • Go言語のコードレビューシステム (Gerrit): コミット 7914043 の詳細なレビュー履歴。