[インデックス 10453] ファイルの概要
このコミットは、Go言語のリポジトリにおける週次開発レポートの更新と、Mercurialタグファイルの修正を含んでいます。具体的には、doc/devel/weekly.htmlファイルに2011年11月18日週の開発状況が追記され、.hgtagsファイルから古い週次タグのエントリが削除されています。
コミット
- コミットハッシュ:
3af28bd886ca5a64128aa2118aac818c61871dad - 作者: Andrew Gerrand adg@golang.org
- コミット日時: 2011年11月19日 07:20:02 +1100
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/3af28bd886ca5a64128aa2118aac818c61871dad
元コミット内容
weekly.2011-11-18
R=golang-dev, dsymonds, r
CC=golang-dev
https://golang.org/cl/5416045
変更の背景
このコミットは、Go言語プロジェクトにおける定期的な週次開発レポートの更新の一環として行われました。doc/devel/weekly.htmlは、Go開発チームが毎週の進捗、重要な変更点、新機能、バグ修正などをコミュニティに報告するために使用するドキュメントです。このコミットは、2011年11月18日週に実施された多数の変更をこのドキュメントに反映させることを目的としています。また、.hgtagsの変更は、Mercurialリポジトリにおけるタグ管理の一環であり、おそらく古いまたは冗長なタグエントリのクリーンアップです。
前提知識の解説
- Go言語 (Golang): Googleによって開発されたオープンソースのプログラミング言語。シンプルさ、効率性、並行処理のサポートを重視しています。このコミットが行われた2011年当時、Goはまだ開発の初期段階にあり、Go 1のリリースに向けて言語仕様や標準ライブラリが活発に調整されていました。
- Mercurial (hg): 分散型バージョン管理システムの一つ。Gitと同様に、コードの変更履歴を管理するために使用されます。Goプロジェクトは初期にはMercurialを使用していましたが、後にGitに移行しました。
.hgtagsファイルはMercurialリポジトリにおけるタグの定義を記録するファイルです。 - Go 1 Plan: Go言語の最初の安定版リリースであるGo 1に向けた計画。Go 1は、言語の安定性と後方互換性を保証することを目的としており、そのためにいくつかの言語仕様の変更やAPIの整理が行われました。このコミットで言及されている「Map and function value comparisons are now disallowed (except for comparison with nil) as per the Go 1 plan」は、この計画の一部です。
- マップと関数の比較: Go言語において、マップ型と関数型の値は、その性質上、等価性の比較が困難または意味をなさない場合があります。特に、マップの内容比較は複雑であり、関数ポインタの比較は特定のコンテキストで問題を引き起こす可能性がありました。Go 1計画では、これらの型の比較を制限することで、言語のセマンティクスを明確にし、予期せぬ挙動を防ぐことが決定されました。
- エクスポートされていないフィールドを含む構造体のコピー: Go言語では、構造体のフィールドが小文字で始まる場合、それはパッケージ外からアクセスできない「エクスポートされていない」フィールドとなります。通常、エクスポートされていないフィールドを含む構造体をパッケージ外で直接コピーすることは制限されることがありますが、この変更では、API設計の柔軟性を高めるために、特定の条件下でこのような構造体のコピーを許可する実験的な試みが行われました。これにより、パッケージは内部実装の詳細を隠蔽しつつ、不透明な値をAPIとして返すことが可能になります。
技術的詳細
このコミットの主要な変更は、doc/devel/weekly.htmlに追加された週次レポートの内容に集約されます。以下に、その中で特に重要な技術的変更点をいくつか抜粋して解説します。
-
言語仕様の変更:
- マップと関数値の比較の禁止: Go 1計画の一環として、
nilとの比較を除き、マップと関数値の直接的な等価性比較が禁止されました。これは、マップの比較がその内容ではなくポインタを比較することになりがちで、関数の等価性も特定のコンテキストで問題があったためです。これにより、言語のセマンティクスがより明確になり、開発者が意図しない比較を行うことを防ぎます。 - エクスポートされていないフィールドを含む構造体のコピーの許可: 実験的に、エクスポートされていないフィールドを含む構造体のコピーが許可されるようになりました。これにより、パッケージはAPIにおいて内部実装を隠蔽した「不透明な値」を返すことが可能になり、API設計の柔軟性が向上します。
- マップと関数値の比較の禁止: Go 1計画の一環として、
-
ツールとビルドシステムの改善:
6a,8a:$(-1)の許可。これはアセンブラにおける記法の一貫性に関する変更です。6l: コード生成の修正。build: Fedoraにおけるselinuxallow_execstackのチェック修正。godefs: 削除され、cgo -godefsに置き換えられました。これはCgoツールチェーンの統合と簡素化を示唆しています。godoc:-templatesフラグのドキュメント化、リモート検索の修正、フラットなディレクトリリスト表示モードの提供。gofmt: ASTのnilノードを未変更のままにする修正。misc/benchcmp: ベンチマーク比較スクリプトの追加。misc/windows: MSI形式のWindowsインストーラの追加。
-
標準ライブラリの更新と修正:
builtin:delete関数のドキュメント化。cgo: 未宣言のenum/structでのパニック防止、g0スタックガードの修正。crypto/tls,crypto: 暗号関連の修正と参照の更新。doc: ドキュメントのクリーンアップ、追加、修正。特にdoc/installにOpenBSDのインストール手順が追加され、「A Tour of Go」の中国語翻訳へのリンクが追加されました。encoding/json: マーシャル/アンマーシャルのベンチマーク追加、空のスライスをnilではなく空のスライスとしてデコードする修正。exp/sql:NumInput()で-1を無視する機能の追加、DB.Closeの追加、バグ修正、Execerの削除(Connのみに)、io.EOFがこれ以上行がないことを意味する旨のドキュメント化、クライアントサイドの公開鍵認証サポート、直接TCP/IPクライアントサポートなど、実験的なSQLパッケージに多数の改善が加えられました。exp/terminal:shellからterminalへのリネームとSetSizeの追加。fmt: 空のスライス/マップとnilのスライス/マップを%#vで区別するようになりました。html/template,html: HTMLテンプレートとパーサーの改善。http,net/http: ファイルサービングの修正、Dir("")がDir(".")と同等になるように変更、EOFハンドリングの修正など、HTTP関連の改善。math/big,math: 数値計算ライブラリの改善。mime: Windows向けにTypeByExtensionを実装。net,io/ioutil:os.Timeの使用を削除。os: 未ドキュメントのEnvsを削除(os.Environを使用)。reflect: 空のスライス/マップがnilとDeepEqualではないように変更、Valueを不透明な構造体に変更。runtime,syscall:godefsからcgoへの変換、Plan 9向けのnanotime追加、タイマーサポート、make([]T, 0)の割り当て回避。strconv:Ftoaのベンチマーク追加と高速化。syscall:syscall.Sleepの削除、環境変数の実装引き継ぎ、エラーの使用。testing: メッセージにファイル:行スタンプを追加、結果を標準出力に出力。text/template: セット解析のリファクタリング。time:TimeにISOWeekメソッドを追加。
これらの変更は、Go 1のリリースに向けて言語の安定性、パフォーマンス、機能性を向上させるための広範な取り組みを示しています。特に、言語仕様の変更はGoの設計思想を反映しており、標準ライブラリの改善はGoが様々な用途で利用されるための基盤を強化しています。
コアとなるコードの変更箇所
このコミットにおけるコードの変更は主に以下の2つのファイルにあります。
-
.hgtags:--- a/.hgtags +++ b/.hgtags @@ -94,4 +94,3 @@ e69e528f2afc25a8334cfb9359fa4fcdf2a934b6 weekly.2011-11-01 780c85032b174c9d4b42adf75d82bc85af7d78d1 weekly.2011-11-02 f4397ad6e87c7ce5feac9b01686f1ebd6cbaac4e weekly.2011-11-08 2f4482b89a6b5956828872137b6b96636cd904d3 weekly.2011-11-09 -2f4482b89a6b5956828872137b6b96636cd904d3 weeklyこの変更では、
2f4482b89a6b5956828872137b6b96636cd904d3 weeklyという行が削除されています。これは、Mercurialのタグファイルから古いまたは冗長なweeklyタグのエントリを削除するものです。 -
doc/devel/weekly.html:--- a/doc/devel/weekly.html +++ b/doc/devel/weekly.html @@ -14,6 +14,86 @@ hg pull hg update weekly.<i>YYYY-MM-DD</i> </pre> +<h2 id="2011-11-18">2011-11-18</h2> + +<pre> +This release includes some language changes. + +Map and function value comparisons are now disallowed (except for comparison +with nil) as per the Go 1 plan. Function equality was problematic in some +contexts and map equality compares pointers, not the maps' content. + +As an experiment, structs are now allowed to be copied even if they contain +unexported fields. This gives packages the ability to return opaque values in +their APIs. + +Other changes: +* 6a, 8a: allow $(-1) for consistency with $1, $(1), $-1. +* 6l: code generation fixes (thanks Michał Derkacz). * ... (以下、上記「技術的詳細」で解説した多数の変更点が列挙されています) </pre> + <h2 id="2011-11-09">2011-11-09</h2>この変更では、
doc/devel/weekly.htmlファイルに、2011年11月18日週のGo開発に関する詳細な変更ログが追加されています。これには、言語仕様の変更、標準ライブラリの更新、ツールの改善など、多岐にわたる項目が含まれています。
コアとなるコードの解説
.hgtagsの変更: このファイルはMercurialリポジトリのタグ情報を管理するために使用されます。特定のコミットハッシュにweeklyというタグが付けられていたものが削除されました。これは、おそらく新しい週次タグが追加されるか、あるいはこの特定のweeklyタグがもはや必要ないと判断されたためです。MercurialからGitへの移行前であったため、このようなタグ管理が行われていました。doc/devel/weekly.htmlの変更: このファイルはGoプロジェクトの公式な開発週次レポートです。このコミットでは、2011年11月18日週のセクションが追加され、その週に行われた主要な変更点(言語仕様の変更、標準ライブラリの機能追加・修正、ツール改善など)が詳細に記述されています。これは、開発チームがコミュニティに対して透明性を保ち、プロジェクトの進捗を定期的に報告するための重要なドキュメントです。
関連リンク
- Go Code Review (CL) リンク:
https://golang.org/cl/5416045このリンクは、このコミットがGoのコードレビューシステム(Gerritベース)でどのようにレビューされたかを示すものです。当時のGoプロジェクトでは、変更がコミットされる前にこのシステムを通じてレビューが行われていました。
参考にした情報源リンク
- Go 1 Release Notes (公式ドキュメント): Go 1のリリースノートは、このコミットで言及されている言語変更(マップと関数の比較、構造体のコピー)の最終的な決定と背景を理解する上で役立ちます。
- https://go.dev/doc/go1compat (Go 1 Compatibility Document)
- https://go.dev/doc/go1 (Go 1 Release Notes)
- Mercurial Documentation:
.hgtagsファイルの役割とMercurialのタグ管理について理解するために参照しました。 - Go言語の各パッケージのドキュメント:
encoding/json,exp/sql,fmt,reflect,runtime,syscall,testing,timeなど、コミットで言及されている各パッケージの当時のドキュメントやソースコードは、個々の変更の具体的な内容を深く理解する上で参考になります。- https://pkg.go.dev/ (Go Packages Documentation)