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

[インデックス 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が最初に現れるインデックスを返します。seps内に存在しない場合は-1を返します。Contains関数は、このIndex関数の結果を利用して実装されています。

技術的詳細

追加されたbytes.Contains関数は、以下のようなシグネチャを持ちます。

func Contains(b, subslice []byte) bool

この関数は2つの引数を受け取ります。

  • b ([]byte): 検索対象となるバイトスライス。
  • subslice ([]byte): b内に存在するかどうかを判定したいバイトサブスライス。

戻り値はbool型で、subsliceb内に存在する場合はtrueを、存在しない場合はfalseを返します。

Contains関数の実装は非常にシンプルで、既存のbytes.Index関数を呼び出し、その結果が-1でないことを確認するだけです。bytes.Index-1を返さないということは、subsliceb内で見つかったことを意味するため、Containstrueを返します。

このアプローチは、コードの重複を避け、既存の最適化された検索ロジック(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関数がsubsliceb内に存在するかどうかを返すことを明確に示しています。

  • func Contains(b, subslice []byte) bool { ... } これが新しく追加されたContains関数の定義です。

    • func: 関数を定義するためのキーワード。
    • Contains: 関数の名前。
    • (b, subslice []byte): 関数のパラメータリスト。bsubsliceという2つのパラメータがあり、どちらも[]byte型(バイトスライス)です。
    • bool: 関数の戻り値の型。この関数は真偽値(trueまたはfalse)を返します。
  • return Index(b, subslice) != -1 この行がContains関数の実際のロジックです。

    • Index(b, subslice): bytesパッケージ内の既存のIndex関数を呼び出しています。この呼び出しは、subsliceb内で最初に見つかった位置のインデックスを返します。subsliceが見つからない場合は-1を返します。
    • != -1: Index関数の戻り値が-1ではないかどうかをチェックしています。もしIndex-1以外の値を返した場合(つまり、subsliceが見つかった場合)、この式はtrueと評価されます。Index-1を返した場合(つまり、subsliceが見つからなかった場合)、この式はfalseと評価されます。

この実装は、Index関数の結果を直接利用することで、簡潔かつ効率的にContainsの機能を実現しています。

関連リンク

参考にした情報源リンク

  • 特になし(コミット内容とGo言語の一般的な知識に基づいています)。