[インデックス 10246] ファイルの概要
このコミットは、Go言語の標準ライブラリであるbytes
パッケージにContains
関数を追加するものです。bytes
パッケージは、バイトスライス([]byte
)を操作するためのユーティリティ関数を提供しており、この追加により、特定のバイトサブスライスが別のバイトスライス内に存在するかどうかを効率的に判定できるようになります。
コミット
- コミットハッシュ:
1a4402a1feab4a8592986a3b3675a3261667e19c
- Author: Andrew Gerrand adg@golang.org
- Date: Fri Nov 4 17:46:52 2011 +1100
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/1a4402a1feab4a8592986a3b3675a3261667e19c
元コミット内容
bytes: add Contains function
R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5349041
変更の背景
Go言語のbytes
パッケージは、文字列操作におけるstrings
パッケージと同様に、バイトスライスに対する一般的な操作を提供します。strings
パッケージには既にContains
関数が存在し、ある文字列が別の文字列に含まれるかを判定する機能を提供していました。同様の機能はバイトスライスに対しても非常に有用であり、開発者がバイトスライス内に特定のパターン(サブスライス)が存在するかどうかを簡単に確認できるようにするために、bytes
パッケージにもContains
関数が追加されることになりました。これにより、コードの可読性と利便性が向上し、開発者はbytes.Index
の結果を直接チェックする代わりに、より意図が明確なbytes.Contains
を使用できるようになります。
前提知識の解説
Go言語のbytes
パッケージ
bytes
パッケージは、Go言語の標準ライブラリの一部であり、バイトスライス([]byte
型)を操作するための多くのユーティリティ関数を提供します。これは、文字列(string
型)を操作するstrings
パッケージと類似していますが、string
が不変であるのに対し、[]byte
は可変であるという点で異なります。bytes
パッケージの関数は、バイナリデータ処理、ネットワークプロトコルの解析、ファイルI/Oなど、様々な場面で利用されます。
バイトスライス([]byte
)
Go言語におけるスライスは、配列のセグメントを参照するデータ構造です。[]byte
はバイトのシーケンスを表し、C言語のchar*
やPythonのbytes
型に似ています。ファイルの内容の読み書き、ネットワーク通信におけるデータの送受信、ハッシュ計算など、生のバイナリデータを扱う際に頻繁に使用されます。
bytes.Index
関数
bytes
パッケージには、既にIndex(s, sep []byte) int
という関数が存在します。この関数は、バイトスライスs
内でバイトサブスライスsep
が最初に現れるインデックスを返します。sep
がs
内に存在しない場合は-1
を返します。Contains
関数は、このIndex
関数の結果を利用して実装されています。
技術的詳細
追加されたbytes.Contains
関数は、以下のようなシグネチャを持ちます。
func Contains(b, subslice []byte) bool
この関数は2つの引数を受け取ります。
b
([]byte
): 検索対象となるバイトスライス。subslice
([]byte
):b
内に存在するかどうかを判定したいバイトサブスライス。
戻り値はbool
型で、subslice
がb
内に存在する場合はtrue
を、存在しない場合はfalse
を返します。
Contains
関数の実装は非常にシンプルで、既存のbytes.Index
関数を呼び出し、その結果が-1
でないことを確認するだけです。bytes.Index
が-1
を返さないということは、subslice
がb
内で見つかったことを意味するため、Contains
はtrue
を返します。
このアプローチは、コードの重複を避け、既存の最適化された検索ロジック(bytes.Index
)を再利用するという点で効率的です。
コアとなるコードの変更箇所
src/pkg/bytes/bytes.go
ファイルに以下の変更が加えられました。
--- a/src/pkg/bytes/bytes.go
+++ b/src/pkg/bytes/bytes.go
@@ -88,6 +88,11 @@ func Count(s, sep []byte) int {
return n
}
+// Contains returns whether subslice is within b.
+func Contains(b, subslice []byte) bool {
+ return Index(b, subslice) != -1
+}
+
// Index returns the index of the first instance of sep in s, or -1 if sep is not present in s.
func Index(s, sep []byte) int {
n := len(sep)
コアとなるコードの解説
追加されたコードは以下の通りです。
// Contains returns whether subslice is within b.
func Contains(b, subslice []byte) bool {
return Index(b, subslice) != -1
}
-
// Contains returns whether subslice is within b.
これは関数のドキュメンテーションコメントです。Go言語では、エクスポートされた(大文字で始まる)関数、変数、型、定数には、その目的を説明するコメントを付けることが慣例となっています。このコメントは、Contains
関数がsubslice
がb
内に存在するかどうかを返すことを明確に示しています。 -
func Contains(b, subslice []byte) bool { ... }
これが新しく追加されたContains
関数の定義です。func
: 関数を定義するためのキーワード。Contains
: 関数の名前。(b, subslice []byte)
: 関数のパラメータリスト。b
とsubslice
という2つのパラメータがあり、どちらも[]byte
型(バイトスライス)です。bool
: 関数の戻り値の型。この関数は真偽値(true
またはfalse
)を返します。
-
return Index(b, subslice) != -1
この行がContains
関数の実際のロジックです。Index(b, subslice)
:bytes
パッケージ内の既存のIndex
関数を呼び出しています。この呼び出しは、subslice
がb
内で最初に見つかった位置のインデックスを返します。subslice
が見つからない場合は-1
を返します。!= -1
:Index
関数の戻り値が-1
ではないかどうかをチェックしています。もしIndex
が-1
以外の値を返した場合(つまり、subslice
が見つかった場合)、この式はtrue
と評価されます。Index
が-1
を返した場合(つまり、subslice
が見つからなかった場合)、この式はfalse
と評価されます。
この実装は、Index
関数の結果を直接利用することで、簡潔かつ効率的にContains
の機能を実現しています。
関連リンク
- Go Code Review (Gerrit) の変更リスト: https://golang.org/cl/5349041
参考にした情報源リンク
- 特になし(コミット内容とGo言語の一般的な知識に基づいています)。