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

[インデックス 18001] ファイルの概要

このコミットは、Go言語の標準ライブラリstringsパッケージ内のTrim関数の使用例を更新するものです。Trim関数の挙動、特に文字列の先頭と末尾の指定された文字のみを削除し、中間にある同じ文字は削除しないという特性をより明確に示すための入力例と期待される出力が修正されています。

コミット

commit 7b53e32e0bfda3bf63c608a83a46a75c7d2e969f
Author: Robin Eklind <r.eklind.87@gmail.com>
Date:   Mon Dec 16 10:40:28 2013 -0800

    strings: Update Trim example.
    
    Use an input which better shows that behaviour of the function. Only leading
    and trailing runes are trimed, not intermediate ones.
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/42390043

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/7b53e32e0bfda3bf63c608a83a46a75c7d2e969f

元コミット内容

strings: Update Trim example.

Use an input which better shows that behaviour of the function. Only leading
and trailing runes are trimed, not intermediate ones.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/42390043

変更の背景

Go言語の標準ライブラリには、各関数の使い方を示すための_test.goファイル内にExample関数が記述されています。これらのExample関数は、go docコマンドやGoの公式ドキュメントサイトで表示され、ユーザーが関数の挙動を理解する上で非常に重要な役割を果たします。

このコミットの背景には、strings.Trim関数の既存のExampleが、その関数の重要な特性を十分に示せていなかったという認識があります。strings.Trimは、指定された文字セット(cutset)に含まれる文字を、文字列の先頭と末尾からのみ削除します。文字列の中間にある同じ文字は削除しません。しかし、元のExampleの入力文字列" !!! Achtung !!! "では、中間部分に削除対象となる文字(!やスペース)が存在しなかったため、この「中間文字は削除されない」という重要な挙動が明確に伝わりませんでした。

この曖昧さを解消し、ユーザーがstrings.Trimの正確な挙動を誤解なく理解できるように、より適切な入力例とそれに対応する出力例に修正する必要がありました。

前提知識の解説

Go言語のstringsパッケージ

stringsパッケージは、Go言語の標準ライブラリの一部であり、UTF-8でエンコードされた文字列を操作するための多くの便利な関数を提供します。文字列の検索、置換、分割、結合、大文字・小文字変換、トリミングなど、多岐にわたる機能が含まれています。

strings.Trim関数

strings.Trim(s, cutset string) stringは、Go言語のstringsパッケージで提供される関数です。

  • s: 処理対象となる元の文字列。
  • cutset: 削除対象となる文字の集合(文字列として指定)。この文字列に含まれる任意の文字が、sの先頭と末尾から削除されます。

この関数の重要な特性は以下の通りです。

  1. 先頭と末尾のみ: cutsetに含まれる文字は、sの先頭と末尾からのみ削除されます。
  2. 中間は対象外: sの中間部分にcutsetに含まれる文字があっても、それらは削除されずに残ります。
  3. 最長一致: 先頭からcutsetに含まれない文字が現れるまで、または文字列の末尾からcutsetに含まれない文字が現れるまで、可能な限り多くの文字が削除されます。

Go言語のExample関数

Go言語では、関数の使用例をExample関数としてテストファイル(_test.go)内に記述する慣習があります。これらの関数は特別な形式で記述され、go docコマンドやGoの公式ドキュメントサイトで自動的に抽出・表示されます。 Example関数は、Output:コメント行を含むことで、その関数の実行結果が期待される出力と一致するかどうかをテストとしても機能させることができます。これにより、ドキュメントとテストが一体となり、常に最新かつ正確な情報が提供されるようになります。

Go言語におけるrune

Go言語において、runeは組み込み型であり、単一のUnicodeコードポイントを表すために使用されます。これは実質的にint32のエイリアスです。Goの文字列はバイトのシーケンスであり、UTF-8でエンコードされています。strings.Trim関数が「runes are trimmed」と説明されているのは、cutsetが文字の集合として扱われ、その集合内の各文字(Unicodeコードポイント)がトリミングの対象となることを意味します。

技術的詳細

このコミットは、strings.Trim関数のExampleを改善することで、その関数のセマンティクスをより正確に反映させることを目的としています。

元のExample:

func ExampleTrim() {
	fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! "))
	// Output: ["Achtung"]
}

この例では、入力文字列" !!! Achtung !!! "から、cutsetである"! "(感嘆符とスペース)が先頭と末尾から削除され、結果として"Achtung"が得られます。この例自体は正しいですが、"Achtung"という単語の中間には!やスペースが含まれていないため、Trimが中間文字を削除しないという重要な挙動が示されていませんでした。

新しいExample:

func ExampleTrim() {
	fmt.Printf("[%q]", strings.Trim(" !!! Achtung! Achtung! !!! ", "! "))
	// Output: ["Achtung! Achtung"]
}

新しい入力文字列" !!! Achtung! Achtung! !!! "では、"Achtung! Achtung"という部分に!やスペースが含まれています。strings.Trimは、この文字列の先頭にある" !!! "と末尾にある" !!! "を削除しますが、中間にある"!"やスペースはcutsetに含まれていても削除しません。これにより、Trim関数が「先頭と末尾のcutset文字のみを削除し、中間はそのままにする」という挙動を明確に示しています。

この変更は、コードの機能自体を変更するものではなく、ドキュメンテーションとテストの品質を向上させるものです。正確なExampleは、ライブラリの利用者が関数を正しく理解し、誤用を防ぐ上で非常に価値があります。

コアとなるコードの変更箇所

変更はsrc/pkg/strings/example_test.goファイル内のExampleTrim関数に限定されています。

--- a/src/pkg/strings/example_test.go
+++ b/src/pkg/strings/example_test.go
@@ -150,8 +150,8 @@ func ExampleToTitle() {
 }
 
 func ExampleTrim() {
-	fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! "))
-	// Output: ["Achtung"]
+	fmt.Printf("[%q]", strings.Trim(" !!! Achtung! Achtung! !!! ", "! "))
+	// Output: ["Achtung! Achtung"]
 }
 
 func ExampleMap() {

具体的には、strings.Trimに渡される第一引数の文字列と、それに続く// Output:コメント行が修正されています。

コアとなるコードの解説

変更された行は以下の通りです。

変更前:

	fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! "))
	// Output: ["Achtung"]

この行では、strings.Trim関数に" !!! Achtung !!! "という文字列と、削除対象文字の集合として"! "(感嘆符とスペース)が渡されています。結果として、先頭と末尾の!とスペースが削除され、"Achtung"が出力されることを期待しています。

変更後:

	fmt.Printf("[%q]", strings.Trim(" !!! Achtung! Achtung! !!! ", "! "))
	// Output: ["Achtung! Achtung"]

変更後では、入力文字列が" !!! Achtung! Achtung! !!! "に変わっています。cutsetは同じ"! "です。 この新しい入力文字列では、"Achtung! Achtung"という部分に!とスペースが含まれています。strings.Trimは、先頭の" !!! "と末尾の" !!! "を削除しますが、文字列の中間にある"!"やスペースは削除しません。そのため、期待される出力は"Achtung! Achtung"となります。

この修正により、strings.Trimが文字列の先頭と末尾のみを処理し、中間部分の文字はcutsetに含まれていても影響を受けないという、関数の正確な挙動がExampleとして明確に示されるようになりました。これは、Goのドキュメンテーションの品質向上に貢献する小さな、しかし重要な改善です。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメント
  • Go言語のソースコード (特にsrc/pkg/strings/strings.gosrc/pkg/strings/example_test.go)
  • Go言語のブログ記事
  • コミットメッセージと変更差分
  • Go言語のstrings.Trim関数の挙動に関する一般的な知識