[インデックス 10050] ファイルの概要
このコミットは、Go言語のweekly.2011-10-18リリースを記録したものです。Go言語の開発初期における重要なマイルストーンの一つで、多くの言語仕様の変更とパッケージの大幅な再編成が行われました。
コミット
- コミットハッシュ: ac21766c958dc1341d79f17c36cc686ed936e6d4
- 作成者: Andrew Gerrand adg@golang.org
- 作成日: 2011年10月19日 11:31:57 +1100
- コミットメッセージ: weekly.2011-10-18
- レビュー: R=rsc
- CC: golang-dev
- Code Review URL: https://golang.org/cl/5302041
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ac21766c958dc1341d79f17c36cc686ed936e6d4
元コミット内容
このコミットでは以下の変更が行われました:
.hgtags
ファイルから1行削除doc/devel/weekly.html
ファイルに131行追加(2011-10-18リリースノート)
変更されたファイル:
- .hgtags(1行削除)
- doc/devel/weekly.html(131行追加)
変更の背景
2011年10月は、Go言語が正式な1.0リリースに向けて準備を進めていた重要な時期でした。Go言語は当時Mercurial(hg)を使用してバージョン管理を行っており、毎週リリースを通じて新機能のテストと改善を行っていました。
このweekly.2011-10-18リリースは、Go 1.0リリースに向けた最後の大規模な言語仕様変更の一つとして位置づけられており、後方互換性を破る変更が含まれていました。Go言語の開発チームは、1.0リリース前にこれらの変更を完了させる必要がありました。
前提知識の解説
Go言語の初期開発体制
Go言語は2009年にGoogleで開発が開始され、2012年のGo 1.0リリースまでは頻繁に仕様変更が行われていました。当時はMercurial(hg)を使用してバージョン管理を行っており、毎週リリース(weekly release)を通じて新機能のテストと改善を行っていました。
週次リリースシステム
Go言語の初期開発では、以下のような週次リリースシステムが採用されていました:
- 毎週、新しいスナップショットをリリース
weekly.YYYY-MM-DD
形式でタグ付け- 開発者は
hg pull
とhg update weekly.YYYY-MM-DD
でアップデート可能
mapの削除構文の歴史
Go言語の初期版では、mapから要素を削除する際にm[x] = 0, false
という特殊な構文を使用していました。この構文は以下の問題がありました:
- 言語仕様内で唯一の2対1代入の特殊ケース
- 削除時に不要な値(通常は無視される)を渡す必要があった
- 一貫性に欠ける構文として議論の対象となっていた
技術的詳細
主要な言語仕様変更
-
mapの削除構文変更
- 旧構文:
m[x] = 0, false
- 新構文:
delete(m, x)
- 移行支援:
gofix
ツールが自動変換をサポート
- 旧構文:
-
return文の厳密化
- 結果変数がシャドウイングされている場合、引数なしのreturn文を拒否
- バグの可能性があるコードの検出強化
-
チャンネル操作の制限
- 受信専用チャンネル(
<-chan T
)のclose操作を禁止 - 型安全性の向上
- 受信専用チャンネル(
-
map反復順序のランダム化
- map反復の最初の要素をランダムに選択
- 反復順序に依存するコードの検出
-
初期化時のgoroutine実行
- プログラム初期化中にgoroutineが実行される可能性
-
文字列とバイトスライスの操作
- 文字列をバイトスライスに追加可能:
b = append(b, s...)
- 文字列をバイトスライスに追加可能:
パッケージ再編成
削除されたパッケージ
gotry
コマンドとtry
パッケージexp/datafmt
パッケージcontainer/vector
パッケージ(スライスで代替)go/typechecker
パッケージ(非推奨)
移動されたパッケージ
gotype
ツール →exp/gotype
go/types
パッケージ →exp/types
ebnflint
ツール →pkg/exp/ebnflint
ebnf
パッケージ →pkg/exp/ebnf
netchan
パッケージ →old/netchan
http/spdy
パッケージ →exp/spdy
コアとなるコードの変更箇所
.hgtags ファイル(commit_data/10050.txt:15-26)
@@ -84,7 +84,6 @@ fd30c132d1bdeb79f8f111cb721fb1c78b767b27 release.r60.1
d7322ae4d055a4cf3efaf842d0717a41acd85bac weekly.2011-09-21
32a5db19629897641b2d488de4d1b998942ef80e release.r60.2
3bdabf483805fbf0c7ef013fd09bfd6062b9d3f2 weekly.2011-10-06
-3bdabf483805fbf0c7ef013fd09bfd6062b9d3f2 weekly
c1702f36df0397c19fc333571a771666029aa37e release.r60.3
c1702f36df0397c19fc333571a771666029aa37e release
acaddf1cea75c059d19b20dbef35b20fb3f38954 release.r58.2
doc/devel/weekly.html ファイル(commit_data/10050.txt:27-164)
2011-10-18セクションの完全な追加(131行)が行われており、以下の主要な変更が記録されています:
- map削除構文の変更説明
The syntax for map deletion has been changed. Code that looks like:
m[x] = 0, false
should be written as:
delete(m, x)
- その他の言語仕様変更
- パッケージの移動・削除リスト
- 各パッケージの詳細な変更履歴
コアとなるコードの解説
Mercurialタグ管理
.hgtags
ファイルの変更は、Mercurialのタグ管理システムに関するものです。削除された行:
3bdabf483805fbf0c7ef013fd09bfd6062b9d3f2 weekly
この変更により、weekly
という汎用的なタグが削除され、具体的な日付付きタグ(weekly.2011-10-06
)のみが残されました。これにより、タグの管理がより明確になり、特定の週次リリースを参照しやすくなりました。
リリースノートの構造
doc/devel/weekly.html
に追加されたリリースノートは、以下の構造で構成されています:
-
重要な変更の警告
- 後方互換性を破る変更があることの明示
- 開発者への注意喚起
-
言語仕様の変更
- map削除構文の変更
- return文の厳密化
- チャンネル操作の制限
- map反復順序のランダム化
-
パッケージの再編成
- 削除されたパッケージのリスト
- 移動されたパッケージのリスト
- 代替手段の提示
-
その他の変更
- 各パッケージの詳細な変更履歴
- コントリビューターへの謝辞
container/vectorパッケージの削除
このリリースで特に重要なのは、container/vector
パッケージの削除です。リリースノートには以下の説明があります:
The container/vector package has been deleted. Slices are better:
http://code.google.com/p/go-wiki/wiki/SliceTricks
これは、Go言語の設計哲学を反映した重要な決定でした。組み込み機能(スライス)で十分な場合は、追加のパッケージを提供しないという方針の表れです。
関連リンク
- Go 1 Release Notes - Go 1.0リリースノート
- Go Wiki: SliceTricks - スライスの使用方法
- Go maps in action - mapの使用方法
- Go by Example: Maps - mapの基本的な使用例