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

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

このコミットは、Go言語の標準ライブラリであるregexpパッケージ内のregexp.goファイルに対する変更です。regexp.goは、正規表現のコンパイルとマッチング機能を提供するGo言語のコアパッケージの一部です。具体的には、MatchReaderMatchStringMatchといった正規表現のマッチングを行う関数群のシグネチャが修正されています。

コミット

このコミットは、regexpパッケージ内のドキュメント修正(doc fix)を目的としています。具体的には、エラー変数の命名規則を古いerrorから現在の慣習であるerrに変更しています。これは、Go言語の進化に伴う変数命名のベストプラクティスへの適応を示しています。

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

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

元コミット内容

commit 7cc0581f86e3f77de44700a0a56c384d9d3677a4
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date:   Thu May 2 18:59:39 2013 -0700

    regexp: doc fix
    
    This must have been from when "error" was a good variable
    name for an "os.Error". But we use "err" these days.
    
    R=golang-dev, dsymonds, r
    CC=golang-dev
    https://golang.org/cl/9132045

変更の背景

この変更の背景には、Go言語のエラーハンドリングにおける変数命名の慣習の進化があります。Go言語の初期のバージョンでは、エラーを返す変数の名前としてerrorが使用されることがありました。しかし、Goコミュニティ全体でコードの可読性と一貫性を高めるために、エラー変数の名前は短縮形のerrを使用するという慣習が確立されました。

コミットメッセージにある「This must have been from when "error" was a good variable name for an "os.Error". But we use "err" these days.」という記述は、この慣習の変化を明確に示しています。os.ErrorはGo 1.0以前に存在したエラーインターフェースで、Go 1.0でerrorインターフェースに統合されました。この変更は、古いコードベースが新しい命名慣習に追従するための、継続的なメンテナンスの一環として行われました。これは機能的な変更ではなく、主にコードのスタイルと一貫性を向上させるための「ドキュメント修正」と位置づけられています。

前提知識の解説

Go言語のエラーハンドリング

Go言語では、エラーは多値返却(multiple return values)によって扱われます。関数は通常、結果とエラーの2つの値を返します。慣習として、エラーは常に最後の戻り値として返され、エラーがない場合はnilが返されます。

func doSomething() (resultType, error) {
    // ... 処理 ...
    if somethingWentWrong {
        return zeroValue, errors.New("something went wrong")
    }
    return actualResult, nil
}

エラー変数の命名については、Goの公式ドキュメントやEffective Goで推奨されているように、短縮形のerrが一般的に使用されます。これは、コードの冗長性を減らし、エラーハンドリングのパターンを視覚的に認識しやすくするためです。

io.RuneReaderインターフェース

io.RuneReaderは、Go言語のioパッケージで定義されているインターフェースです。これは、Unicodeコードポイント(rune)を読み取るためのメソッドReadRune() (r rune, size int, err error)を定義しています。正規表現のマッチングにおいて、バイト列ではなくUnicode文字単位で処理を行う必要がある場合に利用されます。

regexpパッケージ

regexpパッケージは、Go言語で正規表現を扱うための標準ライブラリです。Perlのような正規表現構文をサポートしており、文字列やバイト列、io.RuneReaderから読み取ったテキストに対してパターンマッチングを行う機能を提供します。

  • regexp.Compile(pattern string) (*Regexp, error): 正規表現パターンをコンパイルし、*Regexpオブジェクトを返します。
  • Regexp.Match(b []byte) bool: バイト列が正規表現にマッチするかどうかをチェックします。
  • regexp.MatchReader(pattern string, r io.RuneReader) (matched bool, err error): io.RuneReaderから読み取ったテキストが正規表現にマッチするかどうかをチェックします。
  • regexp.MatchString(pattern string, s string) (matched bool, err error): 文字列が正規表現にマッチするかどうかをチェックします。
  • regexp.Match(pattern string, b []byte) (matched bool, err error): バイト列が正規表現にマッチするかどうかをチェックします。

これらのMatch*関数は、内部でCompileを呼び出して正規表現をコンパイルし、その結果をマッチングに利用します。

技術的詳細

このコミットは、src/pkg/regexp/regexp.goファイル内の以下の3つの関数のシグネチャを変更しています。

  1. func MatchReader(pattern string, r io.RuneReader) (matched bool, error error)
  2. func MatchString(pattern string, s string) (matched bool, error error)
  3. func Match(pattern string, b []byte) (matched bool, error error)

これらの関数は、いずれも戻り値としてerror errorという形式でエラーを返していました。これは、戻り値の変数名がerrorであり、その型もerrorインターフェースであることを示しています。

変更後、これらの関数のシグネチャは以下のようになりました。

  1. func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)
  2. func MatchString(pattern string, s string) (matched bool, err error)
  3. func Match(pattern string, b []byte) (matched bool, err error)

変更点は、戻り値のエラー変数の名前がerrorからerrに変更された点のみです。型は引き続きerrorインターフェースです。

この変更は、Go言語のコードベース全体で一貫したエラー変数命名規則を適用するための一環です。Goの慣習では、エラーを返す変数は通常errと命名されます。これは、コードの可読性を高め、エラーハンドリングのパターンをより明確にするためのものです。

機能的な変更は一切なく、APIの動作やセマンティクスに影響はありません。これは純粋にコードスタイルの改善であり、Go言語の進化するベストプラクティスへの適応を示しています。

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

--- a/src/pkg/regexp/regexp.go
+++ b/src/pkg/regexp/regexp.go
@@ -397,7 +397,7 @@ func (re *Regexp) Match(b []byte) bool {
 // MatchReader checks whether a textual regular expression matches the text
 // read by the RuneReader.  More complicated queries need to use Compile and
 // the full Regexp interface.
-func MatchReader(pattern string, r io.RuneReader) (matched bool, error error) {
+func MatchReader(pattern string, r io.RuneReader) (matched bool, err error) {
 	re, err := Compile(pattern)
 	if err != nil {
 		return false, err
@@ -408,7 +408,7 @@ func MatchReader(pattern string, r io.RuneReader) (matched bool, error error) {
 // MatchString checks whether a textual regular expression
 // matches a string.  More complicated queries need
 // to use Compile and the full Regexp interface.
-func MatchString(pattern string, s string) (matched bool, error error) {
+func MatchString(pattern string, s string) (matched bool, err error) {
 	re, err := Compile(pattern)
 	if err != nil {
 		return false, err
@@ -419,7 +419,7 @@ func MatchString(pattern string, s string) (matched bool, error error) {
 // Match checks whether a textual regular expression
 // matches a byte slice.  More complicated queries need
 // to use Compile and the full Regexp interface.
-func Match(pattern string, b []byte) (matched bool, error error) {
+func Match(pattern string, b []byte) (matched bool, err error) {
 	re, err := Compile(pattern)
 	if err != nil {
 		return false, err

コアとなるコードの解説

上記のdiffを見ると、変更は非常にシンプルです。

  • MatchReader関数のシグネチャで、error errorerr errorに変更されました。
  • MatchString関数のシグネチャで、error errorerr errorに変更されました。
  • Match関数のシグネチャで、error errorerr errorに変更されました。

これらの変更は、関数の戻り値として返されるエラー変数の名前を、Go言語の現在の慣習であるerrに統一するためのものです。変数名がerrorであると、Goのキーワードであるerror型と混同しやすく、コードの可読性を損なう可能性があります。errという短い名前は、エラー変数を明確に識別しつつ、コードの冗長性を避けるためのGoコミュニティの合意されたプラクティスです。

この修正は、関数の内部実装には一切影響を与えず、外部からこれらの関数を呼び出す際の動作も変わりません。これは、Go言語の標準ライブラリが、その進化とともにコードスタイルと慣習を継続的に改善している良い例と言えます。

関連リンク

参考にした情報源リンク