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

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

このコミットは、Go言語の標準ライブラリbytesパッケージ内のFieldsFunc関数のドキュメント記述を修正するものです。具体的には、FieldsFuncが空のスライスを返す条件に関する説明をより正確にするための変更です。

コミット

commit c134ce272f5e1170908771f8371f5f8c01caf37c
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Thu Dec 12 22:13:19 2013 -0500

    bytes: fix description of FieldsFunc
    Similar to CL 3814041 that fixed the same issue in strings.
    Fixes #6941.
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/41490045

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

https://github.com/golang/go/commit/c134ce272f5e1170908771f8371f5f8c01caf37c

元コミット内容

このコミットの目的は、bytesパッケージのFieldsFunc関数のドキュメントにおける記述の誤りを修正することです。これは、stringsパッケージで同様の問題を修正した変更(CL 3814041)に倣ったものです。この修正は、GoのIssue 6941を解決します。

変更の背景

bytes.FieldsFunc関数は、バイトスライスを特定の条件(f(c)を満たすUnicodeコードポイント)に基づいて分割し、その結果をサブスライスのスライスとして返します。元のドキュメントでは、この関数が空のスライスを返す条件について、「If no code points in s satisfy f(c), an empty slice is returned.」(s内のどのコードポイントもf(c)を満たさない場合、空のスライスが返される)と記述されていました。

しかし、この記述は不正確でした。実際には、入力スライスsが空である場合、またはs内のすべてのコードポイントがf(c)を満たす場合にも、FieldsFuncは空のスライスを返します。

この問題は、stringsパッケージのstrings.FieldsFunc関数でも同様に存在し、CL 3814041によって修正されました。このコミットは、その修正をbytesパッケージのbytes.FieldsFuncにも適用し、ドキュメントの正確性を向上させることを目的としています。Issue 6941は、このドキュメントの不正確さを指摘したものです。

前提知識の解説

  • bytes.FieldsFunc関数: bytes.FieldsFuncは、Go言語のbytesパッケージに属する関数です。この関数は、[]byte型のバイトスライスと、rune(Unicodeコードポイント)を受け取りboolを返す関数fを引数に取ります。ftrueを返すコードポイントの連続を区切り文字として、入力バイトスライスをサブスライスに分割します。結果は[][]byte型のスライスとして返されます。

  • strings.FieldsFunc関数: strings.FieldsFuncは、bytes.FieldsFuncと同様の機能を持つ関数ですが、string型を対象とします。文字列を特定の条件(f(c)を満たすUnicodeコードポイント)に基づいて分割し、結果を文字列のスライスとして返します。

  • UTF-8とUnicodeコードポイント: Go言語では、文字列はUTF-8でエンコードされたバイト列として扱われます。rune型は、単一のUnicodeコードポイントを表します。FieldsFuncのような関数は、バイトスライスを直接操作するのではなく、UTF-8デコードされたUnicodeコードポイントのシーケンスとして解釈し、分割処理を行います。これにより、多言語対応が容易になります。

  • CL (Change List): Goプロジェクトにおける「CL」は「Change List」の略で、コードレビューシステムGerritで管理される変更の単位を指します。これは、Gitのコミットに相当する概念ですが、レビュープロセスを経る前の提案段階の変更を指すことが多いです。

  • Issue: Goプロジェクトにおける「Issue」は、バグ報告、機能要望、ドキュメントの改善提案など、プロジェクトに関する議論や追跡が必要な項目を指します。GitHubのIssueトラッカーで管理されます。

技術的詳細

このコミットの技術的な詳細は、bytes.FieldsFunc関数のドキュメント文字列の変更に集約されます。

変更前: If no code points in s satisfy f(c), an empty slice is returned. (s内のどのコードポイントもf(c)を満たさない場合、空のスライスが返される。)

変更後: If all code points in s satisfy f(c), or len(s) == 0, an empty slice is returned. (s内のすべてのコードポイントがf(c)を満たす場合、またはlen(s) == 0の場合、空のスライスが返される。)

この変更により、FieldsFuncが空のスライスを返す条件がより正確に記述されました。

  1. If all code points in s satisfy f(c): これは、入力スライスs内のすべての文字が区切り文字として機能する場合(つまり、f(c)がすべての文字に対してtrueを返す場合)を指します。例えば、s = []byte(" ")で、fがスペースを区切り文字と判断する場合、結果は空のスライスになります。これは、区切り文字のみで構成される入力は、分割されたフィールドを持たないためです。

  2. or len(s) == 0: これは、入力スライスsがそもそも空である場合を指します。空の入力に対しては、分割する内容がないため、当然ながら空のスライスが返されます。

この修正は、関数の実際の動作とドキュメントの乖離を解消し、ユーザーがbytes.FieldsFuncの挙動を正しく理解できるようにするために重要です。特に、エッジケース(空の入力や、すべてが区切り文字である入力)における挙動の明確化は、ライブラリの使いやすさと信頼性を向上させます。

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

--- a/src/pkg/bytes/bytes.go
+++ b/src/pkg/bytes/bytes.go
@@ -265,8 +265,8 @@ func Fields(s []byte) [][]byte {
 
 // FieldsFunc interprets s as a sequence of UTF-8-encoded Unicode code points.
 // It splits the slice s at each run of code points c satisfying f(c) and
-// returns a slice of subslices of s.  If no code points in s satisfy f(c), an
-// empty slice is returned.
+// returns a slice of subslices of s.  If all code points in s satisfy f(c), or
+// len(s) == 0, an empty slice is returned.
 func FieldsFunc(s []byte, f func(rune) bool) [][]byte {
 	n := 0
 	inField := false

コアとなるコードの解説

変更はsrc/pkg/bytes/bytes.goファイル内のFieldsFunc関数のドキュメンテーションコメントにのみ行われています。

  • - returns a slice of subslices of s. If no code points in s satisfy f(c), an empty slice is returned. この行が削除されました。これは、FieldsFuncが空のスライスを返す条件に関する古い、不正確な記述です。

  • + returns a slice of subslices of s. If all code points in s satisfy f(c), or

  • + len(s) == 0, an empty slice is returned. これらの2行が追加されました。これは、FieldsFuncが空のスライスを返す正確な条件を記述しています。

    • If all code points in s satisfy f(c): 入力スライスs内のすべてのUnicodeコードポイントが、区切り文字を判定する関数fによってtrueと評価される場合。
    • or len(s) == 0: 入力スライスsの長さが0、つまり空のスライスである場合。

この変更は、関数のロジック自体には影響を与えず、その外部に公開されるドキュメントの正確性を向上させるためのものです。これにより、開発者はbytes.FieldsFuncの挙動、特にエッジケースにおける挙動をより正確に理解できるようになります。

関連リンク

参考にした情報源リンク