[インデックス 15460] ファイルの概要
このコミットは、Go言語の実験的なロケールパッケージ exp/locale/collate
における変更です。具体的には、以前に提出された変更セット (CL 7060051) に対するコメントに基づいて、ソート関連のコードが修正されています。主な変更点は、sorter
構造体から不要な clean
メソッドの削除と、Collator
型の Strings
メソッドが SortStrings
にリネームされたことです。これにより、APIの明確化とコードの簡素化が図られています。
コミット
commit 5afa271ce35f6f4bdd55569dd7c7ade63523887a
Author: Marcel van Lohuizen <mpvl@golang.org>
Date: Wed Feb 27 11:08:18 2013 +0100
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/5afa271ce35f6f4bdd55569dd7c7ade63523887a
元コミット内容
exp/locale/collate: several changes based on comments on CL 7060051
which was submitted earlier.
R=r
CC=golang-dev
https://golang.org/cl/7402048
変更の背景
このコミットは、以前に提出された変更リスト (Change List: CL) 7060051 に対するレビューコメントに基づいて行われました。Go言語の開発プロセスでは、コードの変更はCLとして提出され、レビューアからのフィードバックを受けて修正されるのが一般的です。CL 7060051 は exp/locale/collate
パッケージに関連するものであり、このコミットはそのCLの改善を目的としています。
具体的な背景としては、sorter
構造体内の clean
メソッドが、その役割を十分に果たしていないか、あるいは不要であると判断された可能性があります。また、Collator
型の Strings
メソッドは、Go標準ライブラリの sort
パッケージにある sort.Strings
と名前が衝突する可能性があり、その機能が文字列のスライスをソートすることであることをより明確にするために SortStrings
へとリネームされたと考えられます。これにより、APIの意図がより明確になり、利用者が混乱するのを防ぐことができます。
前提知識の解説
exp
パッケージ
Go言語の標準ライブラリには、exp
(experimental) というプレフィックスを持つパッケージが存在します。これらは、まだ安定版としてリリースされていない、実験的な機能やAPIを提供するパッケージです。exp
パッケージのAPIは将来的に変更される可能性があり、Goの将来のバージョンで標準ライブラリの一部として昇格するか、あるいは削除されることもあります。このコミットで変更されている exp/locale/collate
もその一つです。
locale
と collate
- Locale (ロケール): ロケールとは、ユーザーの言語、地域、文化的な慣習(日付の書式、通貨、数値の表示方法、文字のソート順など)を定義する一連のパラメータです。ソフトウェアが国際化(i18n)および地域化(l10n)に対応する際に重要な概念となります。
- Collate (照合): 照合とは、文字列を特定のロケール(言語や地域)の規則に従って比較し、ソートするプロセスを指します。例えば、ドイツ語では 'ä' は 'a' と 'b' の間にソートされることがありますが、スウェーデン語では 'z' の後にソートされるなど、言語によってソート順序が異なります。
Unicode Collation Algorithm (UCA)
exp/locale/collate
パッケージは、おそらくUnicode Collation Algorithm (UCA) に基づいて文字列の照合機能を提供しています。UCAは、Unicode Consortiumによって定義された、多言語環境での文字列のソート順序を決定するための標準的なアルゴリズムです。これにより、異なる言語やスクリプトの文字列を、その言語の慣習に従って正しくソートすることが可能になります。
sort.Interface
Go言語の標準ライブラリ sort
パッケージには、ソート可能なコレクションが満たすべきインターフェース sort.Interface
が定義されています。このインターフェースは以下の3つのメソッドを持ちます。
Len() int
: コレクションの要素数を返します。Less(i, j int) bool
: インデックスi
の要素がインデックスj
の要素よりも小さい場合にtrue
を返します。Swap(i, j int)
: インデックスi
とj
の要素を入れ替えます。
sort.Sort
関数は、この sort.Interface
を満たす任意のデータ構造をソートすることができます。exp/locale/collate
パッケージの sorter
構造体も、内部的にこのインターフェースを実装していると考えられます。
技術的詳細
このコミットは、src/pkg/exp/locale/collate/sort.go
と src/pkg/exp/locale/collate/sort_test.go
の2つのファイルに影響を与えています。
-
clean()
メソッドの削除:sorter
構造体からclean()
メソッドが削除されました。このメソッドは、s.buf.key
とs.keys
の長さをチェックし、特定の閾値 (maxSortBuffer
,maxSortEntries
) を超えた場合にバッファをクリアまたはリセットする役割を持っていました。このメソッドが削除されたということは、以下のいずれかの理由が考えられます。- このクリーンアップロジックが不要になった(例えば、ガベージコレクションに任せる、または他の場所で効率的に管理されるようになった)。
- このクリーンアップがパフォーマンス上のボトルネックになっていた、あるいは意図しない副作用を引き起こしていた。
- 設計の見直しにより、
sorter
のライフサイクル管理が変更され、明示的なクリーンアップが不要になった。 一般的に、Goでは不要になったメモリはガベージコレクタが自動的に解放するため、明示的なclean
メソッドは、特定のパフォーマンス要件やリソース管理の最適化が必要な場合にのみ導入されます。この削除は、その必要性がなくなったことを示唆しています。
-
Strings
メソッドからSortStrings
メソッドへのリネーム:Collator
型のStrings
メソッドがSortStrings
にリネームされました。- 旧:
func (c *Collator) Strings(x []string)
- 新:
func (c *Collator) SortStrings(x []string)
この変更は、Go標準ライブラリのsort.Strings
関数との名前の衝突を避けるため、またはメソッドの機能(文字列のスライスをソートすること)をより明確に表現するためと考えられます。sort.Strings
はUTF-8バイト列として文字列をソートしますが、Collator.SortStrings
はロケール固有の照合規則に従ってソートします。名前を区別することで、利用者がどちらのソート機能を使うべきかを明確に判断できるようになります。
- 旧:
-
テストコードの修正:
src/pkg/exp/locale/collate/sort_test.go
のExampleCollator_Strings
関数が、メソッドのリネームに合わせてExampleCollator_SortStrings
に変更され、内部の呼び出しもc.Strings(strings)
からc.SortStrings(strings)
に修正されています。また、テストの入力データに"ab"
が追加され、期待される出力もそれに合わせて更新されています。これは、新しいメソッド名での動作確認と、より包括的なテストケースの追加を意味します。
コアとなるコードの変更箇所
diff --git a/src/pkg/exp/locale/collate/sort.go b/src/pkg/exp/locale/collate/sort.go
index 57b2efdfc2..62f1e75a3c 100644
--- a/src/pkg/exp/locale/collate/sort.go
+++ b/src/pkg/exp/locale/collate/sort.go
@@ -35,15 +35,6 @@ func (s *sorter) init(n int) {
s.keys = s.keys[0:n]
}
-func (s *sorter) clean() {
- if len(s.buf.key) > maxSortBuffer {
- s.buf.key = s.buf.buf[:0]
- }
- if len(s.keys) > maxSortEntries {
- s.keys = nil
- }
-}
-
func (s *sorter) sort(src swapper) {
s.src = src
sort.Sort(s)
@@ -80,8 +71,8 @@ func (c *Collator) Sort(x Lister) {
c.sorter.sort(x)
}
-// Strings sorts x using the rules of c.
-func (c *Collator) Strings(x []string) {
+// SortStrings uses sort.Sort to sort the strings in x using the rules of c.
+func (c *Collator) SortStrings(x []string) {
c.sorter.init(len(x))
for i, s := range x {
c.sorter.keys[i] = c.KeyFromString(c.sorter.buf, s)
diff --git a/src/pkg/exp/locale/collate/sort_test.go b/src/pkg/exp/locale/collate/sort_test.go
index d0682f48e6..49b18b8b3f 100644
--- a/src/pkg/exp/locale/collate/sort_test.go
+++ b/src/pkg/exp/locale/collate/sort_test.go
@@ -14,12 +14,13 @@ func ExampleCollator_Strings() {
c := collate.New("root")
strings := []string{
"ad",
+ "ab",
"äb",
"ac",
}
- c.Strings(strings)
+ c.SortStrings(strings)
fmt.Println(strings)
- // Output: [äb ac ad]
+ // Output: [ab äb ac ad]
}
type sorter []string
コアとなるコードの解説
src/pkg/exp/locale/collate/sort.go
-
- func (s *sorter) clean() { ... }
の削除:sorter
構造体からclean
メソッドが完全に削除されています。このメソッドは、s.buf.key
とs.keys
の内部バッファが一定のサイズ (maxSortBuffer
,maxSortEntries
) を超えた場合に、それらをリセットするロジックを含んでいました。この削除は、このクリーンアップ処理が不要になったか、あるいはより効率的なメモリ管理戦略が採用されたことを示唆しています。Goのガベージコレクタは非常に効率的であるため、多くの場合、明示的なバッファのクリアは不要です。 -
- func (c *Collator) Strings(x []string) {
から+ func (c *Collator) SortStrings(x []string) {
への変更:Collator
型のStrings
メソッドがSortStrings
にリネームされました。これは、メソッドの目的をより明確にし、Go標準ライブラリのsort.Strings
との混同を避けるためのAPI改善です。コメントも「Strings
はc
のルールを使ってx
をソートする」から「SortStrings
はsort.Sort
を使ってc
のルールでx
の文字列をソートする」と、より詳細かつ正確な説明に更新されています。
src/pkg/exp/locale/collate/sort_test.go
-
ExampleCollator_Strings
からExampleCollator_SortStrings
への変更: テスト関数の名前が、対応するメソッドのリネームに合わせて変更されています。これは、テストコードが常に最新のAPIを反映していることを保証するために重要です。 -
テストデータへの
"ab"
の追加:strings
スライスに"ab"
が追加されました。これにより、テストケースがより多様になり、ソートロジックの堅牢性が向上します。 -
c.Strings(strings)
からc.SortStrings(strings)
への変更: テスト内で呼び出されるメソッドが、新しい名前に更新されています。 -
期待される出力の変更:
// Output: [äb ac ad]
から// Output: [ab äb ac ad]
へと変更されています。これは、追加された"ab"
がロケール固有の照合規則に従って正しくソートされることを確認するためのものです。この例では、"ab"
が"äb"
の前にソートされることが示されており、これはロケール固有のソート順序が適用されていることを意味します。
これらの変更は全体として、exp/locale/collate
パッケージのAPIの明確化、コードの簡素化、およびテストの改善を目的としています。
関連リンク
- https://golang.org/cl/7402048 (このコミットに対応するGoの変更リスト)
参考にした情報源リンク
- Go言語の
exp
パッケージに関する一般的な情報 - Unicode Collation Algorithm (UCA) に関する一般的な情報
- Go言語の
sort.Interface
に関するドキュメント