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

[インデックス 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/heapcontainer/listruntime はその一部です。

  • 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標準ライブラリの異なる側面を強化しています。

  1. container/heap: added Fix (CL 12265043)

    • 背景: 以前の container/heap パッケージには、ヒープ内の要素の値が変更された際に、その要素のヒープ内での位置を修正するための直接的なメソッドがありませんでした。要素の値が変更された場合、ヒープのプロパティ(親要素が子要素より常に大きい/小さいなど)が壊れる可能性があります。これを修正するには、一度要素を削除し、新しい値で再度追加するという非効率な手順が必要でした。
    • Fix メソッドの導入: Fix(i int) メソッドは、ヒープの i 番目の要素の値が変更されたことをヒープに通知し、その要素を正しい位置に移動させることでヒープのプロパティを復元します。これにより、ヒープ要素の更新がより効率的に行えるようになりました。これは、例えば優先度キューで要素の優先度が動的に変わるようなシナリオで非常に有用です。
  2. container/list: added MoveBefore and MoveAfter (CL 12021044)

    • 背景: container/list パッケージは双方向連結リストを提供しますが、既存の要素をリスト内の別の位置に移動させるための便利なAPIが不足していました。要素を移動させるには、一度リストから削除し、目的の位置に再度挿入するという手順が必要でした。
    • MoveBefore および MoveAfter メソッドの導入:
      • MoveBefore(e, mark *Element): 要素 emark 要素の直前に移動させます。
      • MoveAfter(e, mark *Element): 要素 emark 要素の直後に移動させます。 これらのメソッドは、リスト内の要素の順序を効率的に変更するための直接的な手段を提供し、リスト操作の柔軟性とパフォーマンスを向上させます。
  3. 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/