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

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

このコミットは、Go言語の2012年1月27日版の週次スナップショット(weekly.2012-01-27)に関する変更を記録したものです。主に、Goプロジェクトの公式ドキュメントであるdoc/devel/weekly.htmlに、この週に導入された多数の変更点や改善点を詳細に記述したリリースノートを追加しています。また、Mercurialのリポジトリタグを管理する.hgtagsファイルも更新されています。

コミット

commit 6786185fd6245c522dce647163d2b33708c0b46d
Author: Andrew Gerrand <adg@golang.org>
Date:   Fri Jan 27 17:51:53 2012 +1100

    weekly.2012-01-27
    
    R=golang-dev, dsymonds
    CC=golang-dev
    https://golang.org/cl/5577060
---
 .hgtags               |   1 -\
 doc/devel/weekly.html | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 107 insertions(+), 1 deletion(-)

diff --git a/.hgtags b/.hgtags
index de48882b30..8dddf3e6a7 100644
--- a/.hgtags
+++ b/.hgtags
@@ -102,4 +102,3 @@ b4a91b6933748db1a7150c06a1b55ad506e52906 weekly.2011-11-18
 4a82689277582a2a60f006e3f158985f2f8d1da3 weekly.2011-12-22
 354b17404643c0f1a710bdc48927dff02f203ae3 weekly.2012-01-15
 9f2be4fbbf690b9562c6e98b91daa0003f0913c7 weekly.2012-01-20
-9f2be4fbbf690b9562c6e98b91daa0003f0913c7 weekly 
diff --git a/doc/devel/weekly.html b/doc/devel/weekly.html
index 60cebc278e..dfaef708de 100644
--- a/doc/devel/weekly.html
+++ b/doc/devel/weekly.html
@@ -14,6 +14,113 @@ hg pull
 hg update weekly.<i>YYYY-MM-DD</i>
 </pre>
 
+<h2 id="2012-01-27">2012-01-27</h2>
+
+<pre>
+This weekly snapshot renamed the html package to exp/html. The package will not
+be present in the Go 1 distribution, but will be installable from source.
+
+Error variables in the archive/tar, archive/zip, compress/gzip, compress/zlib,
+and crypto/bcrypt packages have been renamed from FooError to ErrFoo. 
+There is no gofix, but the compiler will flag code that needs updating.
+
+Other changes:
+* 6c, 8c: make floating point code NaN-safe.
+* 6l, 8l: remove unused macro definition (thanks Shenghou Ma).
+* archive/tar: fix race in TestNonSeekable.
+* archive/zip: add functions to convert between os.FileInfo & FileHeader.
+* build: do not build all C compilers (thanks Shenghou Ma),
+\tremove code now in subrepositories.
+* bytes: remove dead code, complete documentation,
+\trestore panic on out-of-memory,
+\tturn buffer size overflows into errors.
+* cgo: -cdefs should translate unsafe.Pointer to void * (thanks Shenghou Ma).
+* cmd/gc: forgotten recursion on ninit itself in order.c.
+* cmd/go: bug fixes, implement go get,
+\tcorrectly handle -n and -x flags for 'go run' (thanks Shenghou Ma),
+\tsolve ambiguity of get lp.net/project/foo (thanks Gustavo Niemeyer),
+\tupdate doc.go with text generated from the usage strings.
+* cmd/goapi: new tool for tracking exported API over time.
+* codereview: support for subrepositories.
+* compress/flate: fix a typo, improve compression rate by 3-4%,
+\tincrease the length of hash table from 1<<15 to 1<<17. 0%-16% speedup,
+\tmake lazy matching work,
+\treduce memory pressure at cost of additional arithmetic operation,
+\tuse append instead of slice+counter.
+* crypto: rename some FooError to ErrFoo.
+* dashboard: fix -commit for new xml package.
+* database/sql: add NullInt64, NullFloat64, NullBool (thanks James P. Cooper),
+\tconvert SQL null values to []byte as nil (thanks James P. Cooper),
+\tfix Tx.Query (thanks Blake Mizerany).
+* doc: expand FAQ on GOMAXPROCS, update to Go 1.
+* doc/go1: add encoding/xml and net/url changes (thanks Gustavo Niemeyer),
+\tadd more info about hash and net changes, delete reference to html,
+\tadd flag, runtime, testing, image , mime, filepath.Walk,
+\tdocument sub-repositories.
+* encoding/binary: document that PutVarint, PutUvarint may panic.
+* encoding/varint: deleted WriteXvarint.
+* encoding/xml: add docs for ignoring tag (thanks Gustavo Niemeyer),
+\tbring API closer to other packages (thanks Gustavo Niemeyer),
+\timprove []byte handling (thanks Gustavo Niemeyer),
+\tremove Marshaler support (thanks Gustavo Niemeyer),
+\tsupport ignoring fields with "-" (thanks Gustavo Niemeyer).
+* exp/ebnflint: test spec during 'go test'.
+* exp/norm: fixes a subtle bug introduced by change 10087: random offset.
+* gc, runtime: handle floating point map keys.
+* gc: avoid DOT in error messages,
+\tdo not try to add a key with incorrect type to a hash (thanks Jeff R. Allen),
+\tfix order of evaluation,
+\tfix recursion loop in interface comparison,
+\thandle function calls in arguments to builtin complex operations,
+\tmissed typecheck in subscripting a const string,
+\tpermit unsafe.Pointer for inlined functions,
+\tsofter criteria for inlinability,
+\tstatic implements check on typeswitches only applies to concrete case types,
+\ttest case for recursive interface bug.
+* go/ast: respect ImportSpec.EndPos (thanks Scott Lawrence).
+* go/build: add BuildTags to Context, allow !tag.
+* go/doc: rewrite and add lots of tests.
+* go/parser: use explicit parser.Mode type.
+* go/printer, gofmt: respect line breaks in signatures.
+* go/scanner: use explicit scanner.Mode type.
+* gob: annotate debug.go so it's not normally built,
+\treduce the maximum message size.
+* godoc: log node printing error,
+\tmove overview before API TOC,
+\tupdate metadata upon launch.
+* gofix: add -debug flag for quicker diagnosis of internal errors,
+\thandle xml.Unmarshal in xmlapi fix (thanks Gustavo Niemeyer),
+\tupdate go1pkgrename for subrepositories.
+* goyacc: fix indexing bug when yydebug >= 2.
+* ld: fix Mach-O code signing for non-cgo binaries (thanks Mikkel Krautz).
+* libmach: cross compiling support (thanks Shenghou Ma).
+* math/big: assembly versions of bitLen for x86-64, 386, and ARM (thanks David G. Andersen),
+\treturn type of bitLen is an int; use MOVL on amd64 (thanks David G. Andersen),
+\tadd examples for Rat and Int's SetString and Scan methods,
+\tslight improvement to algorithm used for internal bitLen function (thanks David G. Andersen),
+\ttest both bitLen and bitLen_g.
+* net/http: add Request.RequestURI field,
+\tdisabled test for Transport race / deadlock bug,
+\tfix Transport deadlock (thanks Yoshiyuki Kanno),
+\tmake ParseForm ignore unknown content types (thanks Roger Peppe),
+\tparse CONNECT requests (thanks Andrew Balholm).
+* net/rpc: fix data race in benchmark,
+\tfix race in TestClientWriteError test,
+\tlog Call reply discard.
+* net: Dial, ListenPacket with "ip:protocol" network for raw IP sockets (thanks Mikio Hara),
+\tactually reset deadline when time is zero,
+\tconsistent OpError message (thanks Mikio Hara),
+\tfix dialing google test (thanks Mikio Hara),
+\tmake WriteTo fail when UDPConn is already connected (thanks Mikio Hara).
+* regexp: remove vestigial Error type.
+* runtime: add type algorithms for zero-sized types,
+\tmove NumCPU declaration into debug.go.
+* spec: function invocation, panic on *nil.
+* syscall: add NOTE_* constants on OS X (thanks Robert Figueiredo).
+* test: explicitly use variables to avoid gccgo "not used" error.
+* text/template: add example for Template.
+</pre>
+
 <h2 id="2012-01-20">2012-01-20</h2>
 
 <pre>

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

https://github.com/golang/go/commit/6786185fd6245c522dce647163d2b33708c0b46d

元コミット内容

このコミットの目的は、Go言語の週次スナップショット「weekly.2012-01-27」のリリースノートを更新することです。これには、この週に行われた様々なパッケージ、ツール、ランタイム、コンパイラなどの変更点がまとめられています。

変更の背景

Go言語は、初期開発段階からGo 1のリリースに向けて活発に開発が進められていました。この時期は、Go 1の安定版リリースに向けて、APIの整理、パフォーマンスの改善、バグ修正、新機能の追加などが精力的に行われていた時期です。

「週次スナップショット」は、開発の進捗をコミュニティに共有し、早期にフィードバックを得るための重要なメカニズムでした。開発チームは毎週、その週にマージされた主要な変更点をまとめ、doc/devel/weekly.htmlに追記していました。これにより、ユーザーは最新の開発状況を把握し、新しい機能や変更点を試すことができました。

このコミットは、2012年1月27日時点でのGo言語の最新の変更点を公式ドキュメントに反映させることを目的としています。特に、Go 1リリースに向けた重要なAPI変更(例: htmlパッケージの移動、エラー変数名の統一)や、パフォーマンス改善、ツールの強化などが含まれています。

前提知識の解説

このコミットの変更内容を理解するためには、以下のGo言語に関する前提知識が役立ちます。

  • Go言語のリリースサイクルと週次スナップショット: Go言語は、Go 1リリース以前は週次で開発スナップショットを公開していました。これは、開発の進捗を共有し、ユーザーが最新の変更を試せるようにするためのものでした。Go 1リリース後は、より安定したリリースサイクル(半年ごとのメジャーリリースなど)に移行しています。
  • Go 1の互換性保証: Go 1は、Go言語の最初の安定版リリースであり、将来にわたる後方互換性が強く保証されることが特徴でした。このコミットの時期は、Go 1のリリースに向けて、APIの安定化と整理が最終段階に入っていたことを示唆しています。
  • expパッケージ: Go言語の標準ライブラリには、exp(experimental)というプレフィックスを持つパッケージが存在することがあります。これらは実験的なパッケージであり、APIが安定していない、あるいはGoの標準ライブラリに含めるかどうかが検討中であることを示します。このコミットでhtmlパッケージがexp/htmlに移動されたのは、Go 1の安定版には含めないが、引き続き開発・提供は行うという判断があったためと考えられます。
  • エラー変数の命名規則: Go言語では、エラーを表す変数には慣習的にErrプレフィックスを付けることが推奨されています(例: io.EOF)。このコミットでは、既存のFooErrorのような命名からErrFooへの統一が行われており、これはGo 1に向けたAPIの整合性向上の取り組みの一環です。
  • go getコマンド: go getは、Goのパッケージをリモートリポジトリから取得し、ビルドしてインストールするためのコマンドです。このコミットでcmd/gogo getの実装に関する言及があることから、この時期にgo getの機能が強化されたか、あるいは初期の実装が行われたことがわかります。
  • gofixツール: gofixは、Go言語のAPI変更に伴うコードの自動修正を行うためのツールです。Go言語の進化の過程でAPIが変更されることがありましたが、gofixを使うことで既存のコードベースを新しいAPIに簡単に適応させることができました。このコミットでは、エラー変数名の変更に対してgofixが提供されないことが明記されており、手動での修正が必要であることを示しています。
  • サブモジュール/サブリポジトリ: Go言語のプロジェクトでは、特定のパッケージがメインのGoリポジトリとは別のリポジトリで管理されることがあります。これらは「サブリポジトリ」と呼ばれ、Go 1.1以降で正式に導入されました。このコミットの時期には、既にサブリポジトリの概念が導入され始めていたことが示唆されています。

技術的詳細

このコミットでdoc/devel/weekly.htmlに追加された内容は多岐にわたりますが、主要な変更点を以下に分類して解説します。

1. パッケージの移動とAPIの変更

  • htmlパッケージのexp/htmlへの移動:
    • htmlパッケージは、HTMLのパースやレンダリングを扱うためのパッケージでしたが、Go 1の標準ライブラリには含まれないことになり、実験的なexp/htmlパッケージとして提供されることになりました。これは、HTMLの仕様が複雑であり、Go 1のリリースまでに安定したAPIを提供することが難しいと判断されたためと考えられます。しかし、ソースからインストールすることで引き続き利用可能でした。
  • エラー変数の命名規則の統一 (FooErrorからErrFooへ):
    • archive/tar, archive/zip, compress/gzip, compress/zlib, crypto/bcryptなどのパッケージで、エラーを表す変数の命名がFooErrorからErrFooへと変更されました。これはGo言語の慣習に合わせたもので、APIの一貫性を高めるための重要な変更です。この変更にはgofixツールが提供されなかったため、既存のコードは手動で更新する必要がありました。

2. コンパイラ (gc) とランタイム (runtime) の改善

  • 浮動小数点コードのNaN安全性向上:
    • 6c, 8c(Goのコンパイラバックエンド)において、浮動小数点演算がNaN(Not a Number)を安全に扱えるように改善されました。これにより、数値計算の堅牢性が向上します。
  • 浮動小数点マップキーのサポート:
    • gcruntimeにおいて、マップのキーとして浮動小数点数を使用できるようになりました。これは、マップの実装が浮動小数点数の比較(NaNを含む)を正しく扱えるようになったことを意味します。
  • コンパイラのバグ修正と最適化:
    • cmd/gcにおいて、再帰処理のバグ修正、評価順序の修正、インターフェース比較における再帰ループの修正など、多数のバグ修正が行われました。
    • インライン化の基準が緩和され、unsafe.Pointerがインライン関数で許可されるなど、パフォーマンス向上のための最適化も含まれています。
  • ゼロサイズ型の型アルゴリズム追加:
    • runtimeにおいて、ゼロサイズの型(例: struct{})に対する型アルゴリズムが追加されました。これは、メモリ効率の向上や、特定の最適化を可能にするための基盤となります。

3. コマンドラインツール (cmd/go, gofix, godocなど) の強化

  • go getの実装と改善:
    • cmd/goにおいて、go getコマンドのバグ修正と実装に関する言及があります。特に、-n-xフラグの正しい処理や、lp.net/project/fooのような曖昧なパスの解決など、go getの利便性と堅牢性が向上しました。
  • cmd/goapiの新規追加:
    • cmd/goapiという新しいツールが追加されました。これは、時間の経過とともにエクスポートされたAPIを追跡するためのツールであり、APIの変更履歴を管理し、互換性を維持する上で重要な役割を果たします。
  • gofixの機能強化:
    • gofix-debugフラグが追加され、内部エラーの診断が容易になりました。また、xml.Unmarshalの修正や、サブリポジトリに対応するためのgo1pkgrenameの更新も行われました。
  • godocの改善:
    • godocにおいて、ノード印刷エラーのログ記録、API目次の前に概要を移動、起動時のメタデータ更新など、ドキュメンテーション生成ツールの使いやすさが向上しました。

4. 標準ライブラリの機能追加とバグ修正

  • compress/flateのパフォーマンス改善:
    • 圧縮率が3-4%向上し、ハッシュテーブルのサイズが1<<15から1<<17に増加したことで、0%-16%の速度向上が見られました。また、遅延マッチングの改善やメモリ使用量の削減も行われました。
  • database/sqlの機能拡張:
    • NullInt64, NullFloat64, NullBool型が追加され、SQLのNULL値をGoの型に安全に変換できるようになりました。また、SQLのNULL値が[]byteとしてnilに変換されるようになり、Tx.Queryのバグも修正されました。
  • net/httpの改善:
    • Request.RequestURIフィールドが追加され、リクエストURIの取得が容易になりました。Transportのデッドロックの修正、ParseFormが未知のコンテンツタイプを無視するよう変更、CONNECTリクエストのパース機能の追加など、HTTPクライアントとサーバーの機能が強化されました。
  • netパッケージの改善:
    • Dial, ListenPacketで"ip:protocol"ネットワークがサポートされ、raw IPソケットの利用が可能になりました。デッドラインのリセットの修正、OpErrorメッセージの一貫性向上、UDPConnが既に接続されている場合にWriteToが失敗するよう変更など、ネットワーク機能の堅牢性が向上しました。
  • encoding/xmlの改善:
    • タグを無視するためのドキュメント追加、他のパッケージとのAPI整合性の向上、[]byteのハンドリング改善、Marshalerサポートの削除、"-"によるフィールド無視のサポートなど、XMLエンコーディング/デコーディングの柔軟性が向上しました。
  • math/bigの最適化:
    • bitLen関数のアセンブリバージョンがx86-64, 386, ARM向けに追加され、パフォーマンスが向上しました。また、RatIntSetStringおよびScanメソッドの例が追加されました。

5. ドキュメントの更新

  • doc/go1において、encoding/xmlnet/urlの変更、ハッシュとネットワークの変更に関する情報、flag, runtime, testing, image, mime, filepath.Walkに関する情報が追加され、サブリポジトリに関するドキュメントも更新されました。これは、Go 1のリリースノートや移行ガイドの準備が進められていたことを示します。

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

このコミットにおけるコアとなるコードの変更は、以下の2つのファイルに集約されます。

  1. .hgtags:

    • このファイルはMercurialリポジトリのタグを管理するためのものです。Goプロジェクトは元々Mercurialを使用しており、このファイルは特定のコミットハッシュに週次スナップショットのタグ(例: weekly.2012-01-20)を関連付けていました。
    • 変更内容としては、9f2be4fbbf690b9562c6e98b91daa0003f0913c7 weeklyという古いタグのエントリが削除されています。これは、新しい週次スナップショットのタグが追加される際に、古い汎用的なweeklyタグが不要になったためと考えられます。
  2. doc/devel/weekly.html:

    • このファイルは、Go言語の週次開発スナップショットのリリースノートを掲載する公式ドキュメントです。
    • 変更内容の大部分は、<h2 id="2012-01-27">2012-01-27</h2>という新しいセクションの追加と、その中に2012年1月27日の週に行われた多数の変更点(上記「技術的詳細」で解説した内容)を箇条書きで詳細に記述した<pre>ブロックの挿入です。
    • 具体的には、htmlパッケージのexp/htmlへの移動、エラー変数名の統一、コンパイラ、ランタイム、各種標準ライブラリ、ツールの改善やバグ修正など、多岐にわたる変更が網羅的に記述されています。

コアとなるコードの解説

このコミットの主要な目的は、Go言語の最新の開発状況を公式ドキュメントに反映させることです。

  • .hgtagsの変更は、Goプロジェクトが当時使用していたバージョン管理システム(Mercurial)の運用の一部であり、新しい週次スナップショットのリリースに伴うタグ管理の更新を示しています。これは、ユーザーが特定の週次スナップショットのコードベースを簡単にチェックアウトできるようにするためのメタデータ変更です。
  • doc/devel/weekly.htmlへの変更は、Go開発チームがコミュニティに対して透明性を保ち、最新の変更点を明確に伝えるための重要な手段でした。このHTMLファイルに直接変更点を記述することで、ユーザーはGoのウェブサイトを通じて、その週に何が変更されたのか、どのような新機能が追加されたのか、どのようなバグが修正されたのかを簡単に確認できました。
    • 特に、htmlパッケージの移動やエラー変数名の変更といったAPIに関する重要な変更は、ユーザーの既存コードに影響を与える可能性があるため、このようなリリースノートで明確に伝えることが不可欠でした。
    • また、go getの実装やcmd/goapiのような新しいツールの導入は、Goエコシステムの成長と成熟を示すものであり、これらの情報もユーザーにとって非常に価値のあるものでした。
    • パフォーマンス改善やバグ修正の詳細は、Go言語の安定性と効率性が継続的に向上していることを示し、開発者にとってGoを選択する動機付けとなります。

このように、このコミットは単なるコード変更の羅列ではなく、Go言語の進化の過程における重要なマイルストーンを記録し、コミュニティとのコミュニケーションを促進する役割を担っていました。

関連リンク

参考にした情報源リンク

  • Go言語の歴史とリリースサイクルに関する一般的な情報
  • Go言語のexpパッケージに関する一般的な情報
  • Go言語のエラーハンドリングと命名規則に関する一般的な慣習
  • go getコマンドの機能と歴史に関する一般的な情報
  • Go言語のサブリポジトリに関する一般的な情報
  • Mercurialの.hgtagsファイルに関する一般的な情報
  • Go言語のコンパイラ、ランタイム、標準ライブラリの各パッケージに関する一般的なドキュメント