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

[インデックス 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 もその一つです。

localecollate

  • 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): インデックス ij の要素を入れ替えます。

sort.Sort 関数は、この sort.Interface を満たす任意のデータ構造をソートすることができます。exp/locale/collate パッケージの sorter 構造体も、内部的にこのインターフェースを実装していると考えられます。

技術的詳細

このコミットは、src/pkg/exp/locale/collate/sort.gosrc/pkg/exp/locale/collate/sort_test.go の2つのファイルに影響を与えています。

  1. clean() メソッドの削除: sorter 構造体から clean() メソッドが削除されました。このメソッドは、s.buf.keys.keys の長さをチェックし、特定の閾値 (maxSortBuffer, maxSortEntries) を超えた場合にバッファをクリアまたはリセットする役割を持っていました。このメソッドが削除されたということは、以下のいずれかの理由が考えられます。

    • このクリーンアップロジックが不要になった(例えば、ガベージコレクションに任せる、または他の場所で効率的に管理されるようになった)。
    • このクリーンアップがパフォーマンス上のボトルネックになっていた、あるいは意図しない副作用を引き起こしていた。
    • 設計の見直しにより、sorter のライフサイクル管理が変更され、明示的なクリーンアップが不要になった。 一般的に、Goでは不要になったメモリはガベージコレクタが自動的に解放するため、明示的な clean メソッドは、特定のパフォーマンス要件やリソース管理の最適化が必要な場合にのみ導入されます。この削除は、その必要性がなくなったことを示唆しています。
  2. 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 はロケール固有の照合規則に従ってソートします。名前を区別することで、利用者がどちらのソート機能を使うべきかを明確に判断できるようになります。
  3. テストコードの修正: src/pkg/exp/locale/collate/sort_test.goExampleCollator_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.keys.keys の内部バッファが一定のサイズ (maxSortBuffer, maxSortEntries) を超えた場合に、それらをリセットするロジックを含んでいました。この削除は、このクリーンアップ処理が不要になったか、あるいはより効率的なメモリ管理戦略が採用されたことを示唆しています。Goのガベージコレクタは非常に効率的であるため、多くの場合、明示的なバッファのクリアは不要です。

  • - func (c *Collator) Strings(x []string) { から + func (c *Collator) SortStrings(x []string) { への変更: Collator 型の Strings メソッドが SortStrings にリネームされました。これは、メソッドの目的をより明確にし、Go標準ライブラリの sort.Strings との混同を避けるためのAPI改善です。コメントも「Stringsc のルールを使って x をソートする」から「SortStringssort.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の明確化、コードの簡素化、およびテストの改善を目的としています。

関連リンク

参考にした情報源リンク

  • Go言語の exp パッケージに関する一般的な情報
  • Unicode Collation Algorithm (UCA) に関する一般的な情報
  • Go言語の sort.Interface に関するドキュメント