[インデックス 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
の先頭と末尾から削除されます。
この関数の重要な特性は以下の通りです。
- 先頭と末尾のみ:
cutset
に含まれる文字は、s
の先頭と末尾からのみ削除されます。 - 中間は対象外:
s
の中間部分にcutset
に含まれる文字があっても、それらは削除されずに残ります。 - 最長一致: 先頭から
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言語
strings
パッケージのドキュメント: https://pkg.go.dev/strings strings.Trim
関数のドキュメント: https://pkg.go.dev/strings#Trim- Go言語のExample関数に関する公式ブログ記事 (Testing with the Go command): https://go.dev/blog/testing (Example functions are discussed in the "Examples" section)
- Go言語の
rune
に関する解説: https://go.dev/blog/strings
参考にした情報源リンク
- Go言語の公式ドキュメント
- Go言語のソースコード (特に
src/pkg/strings/strings.go
とsrc/pkg/strings/example_test.go
) - Go言語のブログ記事
- コミットメッセージと変更差分
- Go言語の
strings.Trim
関数の挙動に関する一般的な知識