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

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

このコミットは、Go言語の週次スナップショット weekly.2011-12-06 のリリースノートを doc/devel/weekly.html に追加するものです。このスナップショットには、言語仕様の変更(後方互換性あり)、strconv および go/doc パッケージの更新、その他多数の改善が含まれています。

コミット

commit 0367eebb05162efbbbee01c012c195f837c24955
Author: Andrew Gerrand <adg@golang.org>
Date:   Wed Dec 7 13:15:10 2011 +1100

    weekly.2011-12-06

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

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

https://github.com/golang/go/commit/0367eebb05162efbbbee01c012c195f837c24955

元コミット内容

このコミットは、Go言語の週次リリース weekly.2011-12-06 の内容を記述したドキュメントを更新するものです。主な変更点として、言語仕様の変更(複合リテラルにおける型省略の拡張)、strconv パッケージのインターフェース改善とパフォーマンス向上、go/doc パッケージの ToHTML 関数の引数変更が挙げられています。また、crypto/aesencoding/gobfmtgcgofmtnetruntime など、Go言語の様々なコンポーネントにおける細かな改善やバグ修正も含まれています。

変更の背景

Go言語は、初期段階において活発な開発が行われており、言語仕様、標準ライブラリ、ツールチェインが頻繁に更新されていました。このコミットは、その週次開発サイクルの一環として、最新の変更点をユーザーに周知するためのドキュメント更新です。特に、言語の使いやすさの向上(型省略)、パフォーマンスの改善(strconv)、APIの洗練(strconv, go/doc)が主な目的として考えられます。また、gofmt -s のようなツールによるコードの自動整形・簡略化のサポートも、開発体験の向上に寄与しています。

前提知識の解説

Go言語の週次リリース (Weekly Snapshots)

Go言語の初期開発段階では、安定版リリースとは別に、開発の進捗を頻繁に公開するために「週次スナップショット (weekly snapshots)」が提供されていました。これらは、最新の言語機能、ライブラリの変更、バグ修正などをいち早く試すことができるようにするためのもので、開発者コミュニティからのフィードバックを迅速に収集する目的もありました。これらのスナップショットは、Go言語が正式にバージョン1.0をリリースする前の、活発な進化の時期を象徴しています。

複合リテラル (Composite Literals)

Go言語における複合リテラルは、構造体、配列、スライス、マップなどの複合型を初期化するための構文です。例えば、[]int{1, 2, 3} はスライスの複合リテラルです。このコミットで言及されている「型省略 (type elision)」は、複合リテラル内で要素の型を省略できる機能です。例えば、[]int{1, 2, 3} のように、要素の型が親の型から推論できる場合に、[]int{int(1), int(2), int(3)} と書く必要がないことを指します。

strconv パッケージ

strconv パッケージは、Go言語の標準ライブラリの一部で、文字列と基本的なデータ型(整数、浮動小数点数、真偽値など)との間の変換機能を提供します。例えば、strconv.Atoi は文字列を整数に変換し、strconv.Itoa は整数を文字列に変換します。このコミットでは、このパッケージのインターフェースがよりGoらしい(イディオマティックな)ものに改善され、同時にパフォーマンスが大幅に向上したことが示されています。

go/doc パッケージ

go/doc パッケージは、Goのソースコードからドキュメンテーションを抽出・解析するための標準ライブラリです。godoc コマンドやGoの公式ドキュメントサイトのバックエンドとして利用されています。このパッケージは、Goのコードコメントからドキュメントを生成する際に重要な役割を果たします。

gofmtgofix

  • gofmt: Go言語のコードを自動的に整形(フォーマット)するツールです。Goのコードベース全体で一貫したスタイルを強制することで、可読性を高め、コードレビューの負担を軽減します。-s フラグは、より簡潔なコードに書き換える(simplify)機能を提供します。
  • gofix: Go言語のAPI変更や言語仕様の変更に伴い、古いコードを新しいAPIや仕様に自動的に書き換えるためのツールです。大規模なコードベースの移行作業を支援するために開発されました。

技術的詳細

型省略の拡張 (Type Elision Extension)

このコミットの主要な言語変更は、複合リテラルにおける型省略の拡張です。具体的には、配列、スライス、またはマップの複合リテラル内で、ポインタ型の複合リテラルを初期化する際に、そのポインタが指す型の指定を省略できるようになりました。

変更前:

var t = []&T{&T{}, &T{}}

このコードでは、スライス t の要素が *T 型であり、その要素を初期化する際に &T{} と明示的に T 型の複合リテラルを作成し、そのアドレスを取っていました。

変更後:

var t = []&T{{}, {}}

変更後は、&T{} の代わりに {} と書くことができるようになりました。これは、スライスの要素型が &T であることから、コンパイラが {}&T{} と推論できるようになったためです。この変更により、コードがより簡潔になり、可読性が向上します。gofmt -s ツールがこの新しい構文に自動的に変換する機能も追加されました。

strconv パッケージのインターフェース改善とパフォーマンス向上

strconv パッケージは、よりイディオマティックで効率的なインターフェースに刷新されました。具体的なAPIの変更内容はコミットメッセージからは読み取れませんが、通常、GoのAPI改善は、エラーハンドリングの統一、引数の順序の最適化、より明確な関数名の採用などを含みます。この変更は、既存のクライアントコードに影響を与えるため、gofix ツールを使用して自動的にコードを更新できると明記されています。 最も注目すべきは、この変更により strconv の変換速度が 34%から63% も高速化された点です。これは、数値と文字列間の変換が頻繁に行われるアプリケーションにおいて、顕著なパフォーマンス改善をもたらします。

go/doc パッケージの ToHTML 関数の引数変更

go/doc パッケージの ToHTML 関数は、引数として string ではなく []byte を取るように変更されました。

  • 変更前: func ToHTML(s string) []byte (仮定)
  • 変更後: func ToHTML(b []byte) []byte (仮定)

この変更は、文字列データを []byte として直接扱うことで、文字列からバイトスライスへの変換コストを削減し、より効率的な処理を可能にするための最適化と考えられます。特に、ファイルから読み込んだ内容やネットワークから受信したデータを直接処理する場合に有利です。

その他の変更点

コミットメッセージには、上記以外にも多数の細かな改善がリストアップされています。これらはGo言語の様々なサブシステムにおける継続的な改善を示しています。

  • crypto/aes: 境界チェックと切り捨ての最適化。
  • encoding/gob: エクスポートされていないフィールドの型情報を送信しないように変更。これにより、シリアライズされるデータ量が削減され、プライベートな実装詳細が外部に漏れるのを防ぎます。
  • fmt: 浮動小数点数のベンチマーク追加、Stringer または Error インターフェースの実装を持つ型のみを文字列として使用するように変更。
  • gc (Goコンパイラ): インライン化の準備としてのエクスポート形式の変更、マップ/関数の等価性比較の禁止(インターフェース経由)、マップ型の出力時の gofmt スタイル適用。
  • gobuilder: パッケージの -commit モードの追加、一時的な -package モードの無効化、新しいダッシュボードプロトコルの使用。
  • godoc: HTML出力における例の表示改善。
  • gofmt: 複合リテラル簡略化における &T{} の処理。
  • goinstall: -make=true の場合に -install=false フラグを尊重するように変更。
  • net, syscall: UDPConn および IPConn から BindToDevice を削除。
  • os/exec: Windows環境下で LookPath が常にカレントディレクトリを検索するように変更。
  • runtime: 型固有のアルゴリズムの準備。

これらの変更は、Go言語の堅牢性、パフォーマンス、開発ツールの品質を継続的に向上させるための努力の一環です。

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

このコミットのコアとなる変更は、doc/devel/weekly.html ファイルへのコンテンツの追加です。具体的なコードの変更は、HTMLファイル内の新しい <h2 id="2011-12-06">2011-12-06</h2> セクションとその内容の挿入です。

--- a/doc/devel/weekly.html
+++ b/doc/devel/weekly.html
@@ -14,6 +14,56 @@ hg pull
 hg update weekly.<i>YYYY-MM-DD</i>
 </pre>

+<h2 id="2011-12-06">2011-12-06</h2>
+<pre>
+This snapshot includes a language change and changes to the strconv and go/doc
+packages. The package changes require changes to client code.
+The language change is backwards-compatible.
+
+Type elision in arrays, slices, or maps of composite literals has been
+extended to include pointers to composite literals. Code like this
+	var t = []&T{&T{}, &T{}}
+may now be written as
+	var t = []&T{{}, {}}
+You can use gofmt -s to simplify such code.
+
+The strconv package has been given a more idiomatic and efficient interface.
+Client code can be updated with gofix. See the docs for the details:
+	http://weekly.golang.org/pkg/strconv/
+
+The go/doc package\'s ToHTML function now takes a []byte argument instead of a
+string.
+
+Other changes:
+* crypto/aes: eliminate some bounds checking and truncation (thanks Rémy Oudompheng).
+* crypto/x509: if a parent cert has a raw subject, use it.
+* encoding/gob: don\'t send type info for unexported fields.
+* exp/ssh: allow for msgUserAuthBanner during authentication (thanks Gustav Paul).
+* fmt: benchmark floating point,
+\tonly use Stringer or Error for strings.
+* gc: changes in export format in preparation of inlining,
+\tdisallow map/func equality via interface comparison,
+\tuse gofmt spacing when printing map type.
+* go/doc: exclude lines ending in \':\' from possible headings.
+* gobuilder: -commit mode for packages,
+\tcripple -package mode temporarily,
+\tuse new dashboard protocol.
+* godoc: improved output of examples in html (thanks Volker Dobler).
+* gofmt: handle &T in composite literal simplify.
+* goinstall: honour -install=false flag when -make=true.
+* hash: rewrite comment on Hash.Sum method.
+* html: more parser improvements (thanks Andrew Balholm).
+* image: avoid func comparison during ColorModel comparison.
+* math: add special-cases comments to Sinh and Tanh (thanks Charles L. Dorian).
+* misc/dashboard: further implementation work.
+* net, syscall: remove BindToDevice from UDPConn, IPConn (thanks Mikio Hara).
+* net/mail: correctly compare parsed times in the test.
+* os/exec: make LookPath always search CWD under Windows (thanks Benny Siegert).
+* runtime: prep for type-specific algorithms.
+* strconv: 34% to 63% faster conversions.
+</pre>
+
 <h2 id="2011-12-02">2011-12-02</h2>

また、.hgtags ファイルからは、0beb796b4ef8747af601ed5ea6766d5b1340086b weekly というタグが削除されています。これは、週次スナップショットのタグ付け方法の変更、または特定のタグの整理を示唆している可能性があります。

コアとなるコードの解説

このコミット自体は、Go言語のソースコードやライブラリの機能を直接変更するものではなく、それらの変更を記述したドキュメントを更新するものです。したがって、「コアとなるコード」とは、このドキュメントに記述されているGo言語本体の変更点を指します。

最も重要な変更点は以下の3つです。

  1. 複合リテラルにおけるポインタ型への型省略の拡張:

    • これはGo言語のコンパイラとパーサーの内部ロジックに影響を与える変更です。コンパイラは、複合リテラル内の要素の型を推論する際に、より高度な推論規則を適用するようになりました。これにより、開発者は冗長な型指定を省略でき、コードの記述量を減らすことができます。
    • gofmt -s がこの新しい構文を適用するように更新されたことも重要です。これは、既存のコードベースを新しい、より簡潔なスタイルに自動的に移行できることを意味し、開発者の手間を大幅に削減します。
  2. strconv パッケージのインターフェース改善とパフォーマンス向上:

    • strconv パッケージの内部実装が大幅に最適化されたことを示しています。これは、数値と文字列間の変換アルゴリズムの見直し、メモリ割り当ての削減、またはより効率的なCPU命令の使用などによって達成されたと考えられます。
    • インターフェースの変更は、strconv パッケージのAPIがよりGoの設計原則に沿ったものになったことを意味します。これは、パッケージの使いやすさと一貫性を向上させます。gofix のサポートは、このAPI変更が既存のコードに与える影響を緩和するための重要な措置です。
  3. go/doc パッケージの ToHTML 関数の引数変更 (string から []byte へ):

    • これは、go/doc パッケージのAPI変更であり、主にパフォーマンスと効率性を目的としています。Go言語では、文字列は不変のバイトシーケンスとして内部的に表現されますが、[]byte は可変のバイトシーケンスです。多くのI/O操作やデータ処理では []byte が直接扱われるため、string から []byte への変換を避けることで、不要なメモリコピーや割り当てを削減できます。これにより、ToHTML 関数の呼び出し元が既に []byte 形式でデータを持っている場合に、より効率的な処理が可能になります。

これらの変更は、Go言語が初期段階でいかにパフォーマンスと開発者の利便性を重視して進化していたかを示しています。

関連リンク

  • Go言語公式ブログ (当時の週次更新に関する情報がある可能性)
  • Go言語のドキュメンテーション (特に strconvgo/doc パッケージの当時のドキュメント)
  • Go言語のIssue Tracker (関連するバグ修正や機能追加の議論)

参考にした情報源リンク

  • https://golang.org/cl/5453070 (Go Code Review System の変更リストへのリンク)
  • https://weekly.golang.org/pkg/strconv/ (当時の strconv パッケージの週次ドキュメントへのリンク)
  • Google検索 (Go言語の型省略、strconv、go/doc、gofmt、gofixに関する当時の情報)
    • "Go language type elision composite literals 2011"
    • "Go strconv package evolution 2011"
    • "Go go/doc package ToHTML []byte string 2011"
    • "Go gofmt -s composite literals"
    • "Go gofix tool"
    • "Go weekly snapshots 2011"