[インデックス 16856] ファイルの概要
このコミットは、Go言語の標準ライブラリunicode
パッケージに新しく追加されたunicode.In
関数のドキュメントを、Go 1.2のリリースノートファイルdoc/go1.2.txt
に追記するものです。unicode.In
は、既存のunicode.IsOneOf
関数と同等の機能を提供しますが、より使いやすいシグネチャを持つことが特徴です。
コミット
- コミットハッシュ:
ac94c06d1e57fb4e41b547ce7652a6d698cfcf17
- 作者: Rob Pike r@golang.org
- コミット日時: 2013年7月24日(水) 10:54:33 +1000
- コミットメッセージ:
doc/go1.2.txt: document new function unicode.In R=golang-dev, dsymonds CC=golang-dev https://golang.org/cl/11745044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ac94c06d1e57fb4e41b547ce7652a6d698cfcf17
元コミット内容
commit ac94c06d1e57fb4e41b547ce7652a6d698cfcf17
Author: Rob Pike <r@golang.org>
Date: Wed Jul 24 10:54:33 2013 +1000
doc/go1.2.txt: document new function unicode.In
R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/11745044
---
doc/go1.2.txt | 1 +
1 file changed, 1 insertion(+)
diff --git a/doc/go1.2.txt b/doc/go1.2.txt
index 079b4f762b..a47a24145d 100644
--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -26,3 +26,4 @@ net: new build tag netgo for building a pure Go net package (CL 7100050).
sort: new Stable function provides stable sort (CL 9612044).
syscall: implemented Sendfile for Darwin, added Syscall9 for Darwin/amd64 (CL 10980043).
testing: AllocsPerRun is now quantized to an integer (the type is still float64) (CL 9837049).
+unicode: add In, a nicer-to-use but equivalent version of IsOneOf (CL 11672044).
変更の背景
このコミットの背景には、Go言語のunicode
パッケージにおける文字集合の判定関数の使いやすさの改善があります。既存のunicode.IsOneOf
関数は、複数のRangeTable
(文字の範囲を定義する構造体)に対してルーン(Unicodeコードポイント)が属するかどうかを判定するために使用されていました。しかし、この関数はRangeTable
のスライスを引数として取るため、複数の文字集合をチェックする際に、事前にスライスを作成する必要がありました。
unicode.In
関数は、このIsOneOf
関数と全く同じ機能を提供しますが、可変長引数(variadic arguments)としてRangeTable
を直接受け取ることができます。これにより、開発者はより簡潔なコードで同じ処理を記述できるようになり、APIの使い勝手が向上しました。この変更は、Go言語の設計哲学である「シンプルさと実用性」に沿った改善と言えます。
前提知識の解説
このコミットを理解するためには、以下のGo言語およびUnicodeに関する基本的な知識が必要です。
-
Go言語の
unicode
パッケージ: Go言語の標準ライブラリであるunicode
パッケージは、Unicode文字のプロパティ(カテゴリ、スクリプト、範囲など)を扱うための機能を提供します。これにより、多言語対応のアプリケーション開発が容易になります。 -
rune
型: Go言語では、Unicodeコードポイントを表現するためにrune
型が使用されます。rune
はint32
のエイリアスであり、UTF-8でエンコードされた文字列から個々のUnicode文字を安全に扱うことができます。 -
unicode.RangeTable
:unicode
パッケージにおいて、RangeTable
はUnicodeコードポイントの集合、つまり特定の文字の範囲を定義するために使用される構造体です。例えば、unicode.Latin
はラテン文字の範囲を、unicode.Cyrillic
はキリル文字の範囲を定義するRangeTable
です。これらのRangeTable
は、Unicodeの文字プロパティデータベースに基づいて定義されています。 -
unicode.IsOneOf
関数:func IsOneOf(ranges []*RangeTable, r rune) bool
この関数は、与えられたルーンr
が、ranges
スライスで指定されたいずれかのRangeTable
に含まれるかどうかを判定します。例えば、ある文字がラテン文字またはギリシャ文字のいずれかであるかをチェックする際に使用されます。import "unicode" r := 'é' // 'é' が Latin または Greek のいずれかに含まれるかチェック isOneOf := unicode.IsOneOf([]*unicode.RangeTable{unicode.Latin, unicode.Greek}, r) fmt.Printf("Is '%c' one of Latin or Greek? %t\n", r, isOneOf) // Output: Is 'é' one of Latin or Greek? true
技術的詳細
このコミットでドキュメントが追加されたunicode.In
関数は、unicode.IsOneOf
関数と機能的には同等ですが、そのシグネチャ(関数の定義)が異なります。
-
unicode.IsOneOf
のシグネチャ:func IsOneOf(ranges []*RangeTable, r rune) bool
この関数は、第一引数として*unicode.RangeTable
型のスライスを受け取ります。これは、チェックしたい文字集合が複数ある場合に、それらを事前にスライスにまとめて渡す必要があることを意味します。 -
unicode.In
のシグネチャ:func In(r rune, ranges ...*RangeTable) bool
この関数は、第一引数にチェック対象のルーンr
を取り、第二引数以降に可変長引数として*unicode.RangeTable
を受け取ります。可変長引数を使用することで、呼び出し側はRangeTable
のスライスを明示的に作成することなく、複数のRangeTable
を直接引数として渡すことができます。import "unicode" r := 'é' // 'é' が Latin または Greek のいずれかに含まれるかチェック (In関数を使用) isIn := unicode.In(r, unicode.Latin, unicode.Greek) fmt.Printf("Is '%c' in Latin or Greek? %t\n", r, isIn) // Output: Is 'é' in Latin or Greek? true
この違いは、特に複数のRangeTable
に対してチェックを行う場合に顕著です。IsOneOf
では[]*unicode.RangeTable{unicode.Latin, unicode.Greek}
のようにスライスリテラルを記述する必要がありましたが、In
ではunicode.Latin, unicode.Greek
のように直接列挙できるため、コードがより簡潔になります。Go言語のドキュメントでも、unicode.In
が「より良いシグネチャを提供し、IsOneOf
よりも優先して使用されるべき」と明記されています。
この変更は、Go 1.2のリリースの一部として導入されました。Go 1.2のリリースノート自体は、スケジューラの改善やgoroutineの最小スタックサイズの増加など、より広範なパフォーマンスとランタイムの改善に焦点を当てていましたが、このようなAPIの使いやすさの改善も含まれていました。
コアとなるコードの変更箇所
このコミットによるコードの変更は、doc/go1.2.txt
ファイルへの1行の追加のみです。
--- a/doc/go1.2.txt
+++ b/doc/go1.2.txt
@@ -26,3 +26,4 @@ net: new build tag netgo for building a pure Go net package (CL 7100050).
sort: new Stable function provides stable sort (CL 9612044).
syscall: implemented Sendfile for Darwin, added Syscall9 for Darwin/amd64 (CL 10980043).
testing: AllocsPerRun is now quantized to an integer (the type is still float64) (CL 9837049).
+unicode: add In, a nicer-to-use but equivalent version of IsOneOf (CL 11672044).
具体的には、以下の行が追加されました。
+unicode: add In, a nicer-to-use but equivalent version of IsOneOf (CL 11672044).
コアとなるコードの解説
追加された1行は、Go 1.2のリリースノートの一部として、unicode
パッケージに新しい関数In
が追加されたことを簡潔に説明しています。
unicode: add In
:unicode
パッケージにIn
関数が追加されたことを示します。a nicer-to-use but equivalent version of IsOneOf
:In
関数が、既存のIsOneOf
関数と同等の機能を持つが、より使いやすいバージョンであることを説明しています。これは、前述の可変長引数によるAPIの改善を指しています。(CL 11672044)
: この変更が、Gerritの変更リスト(Change-ID)11672044
によって導入されたことを示しています。このCL(Change List)は、実際にunicode.In
関数が追加されたコミットを指します。このコミット自体は、その変更をリリースノートに反映させるためのドキュメントコミットです。
この行は、Go 1.2のユーザーが新しいunicode.In
関数の存在とその利便性を認識できるようにするための重要な情報です。
関連リンク
- Gerrit Change-ID (CL 11745044): このドキュメントコミットのGerritページ https://golang.org/cl/11745044
- Gerrit Change-ID (CL 11672044):
unicode.In
関数が実際に追加されたコミットのGerritページ https://golang.org/cl/11672044
参考にした情報源リンク
- Go言語
unicode
パッケージのドキュメント:unicode.In
とunicode.IsOneOf
の比較 - Go 1.2 Release Notes (公式ドキュメント)
unicode.In
とunicode.IsOneOf
の違いに関する解説記事