[インデックス 17089] ファイルの概要
このコミットは、Go 1.2 リリースノートのドラフトである doc/go1.2.txt
ファイルを更新し、以前にコミットされたいくつかの新機能や変更点を追記するものです。具体的には、container/heap
パッケージへの Fix
メソッドの追加、container/list
パッケージへの MoveBefore
および MoveAfter
メソッドの追加、そして runtime
パッケージの SetFinalizer
関数が func(interface{})
型の関数を受け入れるようになった変更が文書化されています。
コミット
commit 2f0acc1e8010f03e86ce72f3c2aac13958d5ff41
Author: Pieter Droogendijk <pieter@binky.org.uk>
Date: Thu Aug 8 09:57:31 2013 -0700
doc/go1.2.txt: document previously committed features
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/12585044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/2f0acc1e8010f03e86ce72f3c2aac13958d5ff41
元コミット内容
doc/go1.2.txt: document previously committed features
このコミットは、Go 1.2 のリリースノートドラフトである doc/go1.2.txt
に、既にメインブランチにマージされていたが、まだ公式なリリースノートに記載されていなかった機能を追加するものです。
変更の背景
Go言語の開発プロセスでは、新機能やバグ修正はまず個別の変更リスト(Change List, CL)として提案され、レビューを経てメインのコードベースにマージされます。しかし、これらの変更がすぐにリリースノートに反映されるわけではありません。リリースが近づくと、そのリリースに含まれるすべての重要な変更点をまとめたリリースノートが作成されます。
このコミットの背景には、Go 1.2 のリリースに向けて、既に実装されマージされていたにもかかわらず、まだ doc/go1.2.txt
に記載されていなかった以下の3つの重要な変更点を文書化する必要があったという事情があります。これにより、ユーザーはGo 1.2で利用可能になる新機能や改善点を正確に把握できるようになります。
前提知識の解説
Go言語の標準ライブラリ
Go言語は、豊富な標準ライブラリを提供しており、これらはGoプログラム開発の基盤となります。このコミットで言及されている container/heap
、container/list
、runtime
はその一部です。
container/heap
パッケージ: ヒープデータ構造(優先度キュー)の実装を提供します。heap.Interface
を実装することで、任意の型のコレクションをヒープとして扱うことができます。container/list
パッケージ: 双方向連結リスト(doubly linked list)の実装を提供します。要素の追加、削除、移動などを効率的に行えます。runtime
パッケージ: Goランタイムシステムとのインタフェースを提供します。ガベージコレクション、ゴルーチン管理、低レベルのシステムコールなど、Goプログラムの実行環境に関する機能が含まれます。
ガベージコレクションとファイナライザ
Go言語は自動メモリ管理(ガベージコレクション、GC)を採用しています。プログラマはメモリの解放を明示的に行う必要がありません。
ファイナライザは、オブジェクトがガベージコレクタによってメモリから解放される直前に実行される関数です。runtime.SetFinalizer
関数を使って、特定のオブジェクトにファイナライザを設定できます。これは、ファイルハンドルやネットワーク接続などの外部リソースをクリーンアップする際に便利です。
Goの変更リスト (Change List, CL)
Goプロジェクトでは、コードの変更はGerritというコードレビューシステムを通じて管理されます。各変更は「Change List (CL)」として提出され、レビューと承認を経てメインのコードベースにマージされます。コミットメッセージに記載されている CL 12265043
のような番号は、Gerrit上の特定の変更リストを指します。
技術的詳細
このコミットで文書化された3つの変更点は、それぞれGo標準ライブラリの異なる側面を強化しています。
-
container/heap: added Fix (CL 12265043)
- 背景: 以前の
container/heap
パッケージには、ヒープ内の要素の値が変更された際に、その要素のヒープ内での位置を修正するための直接的なメソッドがありませんでした。要素の値が変更された場合、ヒープのプロパティ(親要素が子要素より常に大きい/小さいなど)が壊れる可能性があります。これを修正するには、一度要素を削除し、新しい値で再度追加するという非効率な手順が必要でした。 Fix
メソッドの導入:Fix(i int)
メソッドは、ヒープのi
番目の要素の値が変更されたことをヒープに通知し、その要素を正しい位置に移動させることでヒープのプロパティを復元します。これにより、ヒープ要素の更新がより効率的に行えるようになりました。これは、例えば優先度キューで要素の優先度が動的に変わるようなシナリオで非常に有用です。
- 背景: 以前の
-
container/list: added MoveBefore and MoveAfter (CL 12021044)
- 背景:
container/list
パッケージは双方向連結リストを提供しますが、既存の要素をリスト内の別の位置に移動させるための便利なAPIが不足していました。要素を移動させるには、一度リストから削除し、目的の位置に再度挿入するという手順が必要でした。 MoveBefore
およびMoveAfter
メソッドの導入:MoveBefore(e, mark *Element)
: 要素e
をmark
要素の直前に移動させます。MoveAfter(e, mark *Element)
: 要素e
をmark
要素の直後に移動させます。 これらのメソッドは、リスト内の要素の順序を効率的に変更するための直接的な手段を提供し、リスト操作の柔軟性とパフォーマンスを向上させます。
- 背景:
-
runtime: allow SetFinalizer with a func(interface{}) (CL 11858043)
- 背景: 以前の
runtime.SetFinalizer
関数は、ファイナライザとして設定できる関数のシグネチャに制約がありました。具体的には、ファイナライザ関数はfunc(obj *Type)
のように、特定の型のポインタを引数として受け取る必要がありました。これは、ジェネリックなファイナライザを書くことを困難にしていました。 func(interface{})
のサポート: この変更により、runtime.SetFinalizer
は、ファイナライザとしてfunc(interface{})
シグネチャを持つ関数を受け入れるようになりました。interface{}
はGoにおける任意の型を表すため、これにより、ファイナライザ関数をより汎用的に記述できるようになり、異なる型のオブジェクトに対して同じファイナライザ関数を再利用することが容易になりました。これは、特にライブラリ開発において、より柔軟なリソース管理メカニズムを提供します。
- 背景: 以前の
コアとなるコードの変更箇所
このコミット自体は、既存のコードの機能を変更するものではなく、Go 1.2 のリリースノートドラフトである doc/go1.2.txt
に以下の3行を追加するものです。
--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -12,6 +12,8 @@ cmd/5a: removed support for R9/R10 (use m/g instead) (CL 9840043).
cmd/cgo, cmd/go: support including C++ code with cgo (CL 8248043).
cmd/go: test coverage (CL 10413044).
+container/heap: added Fix (CL 12265043).
+container/list: added MoveBefore and MoveAfter (CL 12021044).
crypto/md5: Sum function to simplify hashing (CL10624044).
crypto/sha1: Sum function to simplify hashing (CL 10571043).
crypto/sha256: Sum256 and Sum224 functions to simplify hashing (CL 10629043).
@@ -27,6 +29,7 @@ image/draw: added Quantizer type (CL 11148043).\n image/gif: added Encode and EncodeAll (CL 10896043).\n io: Copy prioritizes WriterTo over ReaderFrom (CL 9462044).\n net: new build tag netgo for building a pure Go net package (CL 7100050).\n+runtime: allow SetFinalizer with a func(interface{}) (CL 11858043).\n runtime: preemption of goroutines at function entry (CL 12371043).\n sort: new Stable function provides stable sort (CL 9612044).\n syscall: implemented Sendfile for Darwin, added Syscall9 for Darwin/amd64 (CL 10980043).\n
コアとなるコードの解説
追加された各行は、Go 1.2 で導入された特定の機能強化を簡潔に説明しています。
-
container/heap: added Fix (CL 12265043).
- これは、
container/heap
パッケージにFix
メソッドが追加されたことを示しています。このメソッドは、ヒープ内の要素の値が変更されたときに、その要素のヒープ内での位置を効率的に修正するために使用されます。
- これは、
-
container/list: added MoveBefore and MoveAfter (CL 12021044).
- これは、
container/list
パッケージにMoveBefore
およびMoveAfter
メソッドが追加されたことを示しています。これらのメソッドは、双方向連結リスト内の既存の要素を、指定された別の要素の前または後に移動させるためのものです。
- これは、
-
runtime: allow SetFinalizer with a func(interface{}) (CL 11858043).
- これは、
runtime.SetFinalizer
関数が、ファイナライザとしてfunc(interface{})
型の関数を受け入れるようになったことを示しています。これにより、ファイナライザをより汎用的に記述できるようになり、異なる型のオブジェクトに対して同じファイナライザ関数を適用することが容易になります。
- これは、
これらの記述は、Go 1.2 のリリースノートの一部として、ユーザーが新しいAPIや改善点を素早く把握できるようにするためのものです。
関連リンク
-
container/heap: added Fix:
- Original CL: https://golang.org/cl/12265043
- GoDoc for
container/heap
: https://pkg.go.dev/container/heap
-
container/list: added MoveBefore and MoveAfter:
- Original CL: https://golang.org/cl/12021044
- GoDoc for
container/list
: https://pkg.go.dev/container/list
-
runtime: allow SetFinalizer with a func(interface{}):
- Original CL: https://golang.org/cl/11858043
- GoDoc for
runtime.SetFinalizer
: https://pkg.go.dev/runtime#SetFinalizer
参考にした情報源リンク
- Go 1.2 Release Notes (最終版): https://go.dev/doc/go1.2
- GoDoc (Go Packages Documentation): https://pkg.go.dev/
- Gerrit Code Review (Go Project): https://go-review.googlesource.com/