[インデックス 16262] ファイルの概要
このコミットは、Go言語の標準ライブラリであるregexp
パッケージ内のregexp.go
ファイルに対する変更です。regexp.go
は、正規表現のコンパイルとマッチング機能を提供するGo言語のコアパッケージの一部です。具体的には、MatchReader
、MatchString
、Match
といった正規表現のマッチングを行う関数群のシグネチャが修正されています。
コミット
このコミットは、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つの関数のシグネチャを変更しています。
func MatchReader(pattern string, r io.RuneReader) (matched bool, error error)
func MatchString(pattern string, s string) (matched bool, error error)
func Match(pattern string, b []byte) (matched bool, error error)
これらの関数は、いずれも戻り値としてerror error
という形式でエラーを返していました。これは、戻り値の変数名がerror
であり、その型もerror
インターフェースであることを示しています。
変更後、これらの関数のシグネチャは以下のようになりました。
func MatchReader(pattern string, r io.RuneReader) (matched bool, err error)
func MatchString(pattern string, s string) (matched bool, err error)
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 error
がerr error
に変更されました。MatchString
関数のシグネチャで、error error
がerr error
に変更されました。Match
関数のシグネチャで、error error
がerr error
に変更されました。
これらの変更は、関数の戻り値として返されるエラー変数の名前を、Go言語の現在の慣習であるerr
に統一するためのものです。変数名がerror
であると、Goのキーワードであるerror
型と混同しやすく、コードの可読性を損なう可能性があります。err
という短い名前は、エラー変数を明確に識別しつつ、コードの冗長性を避けるためのGoコミュニティの合意されたプラクティスです。
この修正は、関数の内部実装には一切影響を与えず、外部からこれらの関数を呼び出す際の動作も変わりません。これは、Go言語の標準ライブラリが、その進化とともにコードスタイルと慣習を継続的に改善している良い例と言えます。
関連リンク
- Go言語の公式ドキュメント - Effective Go: Error Handling: https://go.dev/doc/effective_go#errors
- Go言語の公式ドキュメント - regexpパッケージ: https://pkg.go.dev/regexp
- Go言語の公式ドキュメント - ioパッケージ: https://pkg.go.dev/io
参考にした情報源リンク
- https://go.dev/doc/effective_go#errors
- https://pkg.go.dev/regexp
- https://pkg.go.dev/io
- https://golang.org/cl/9132045 (GoのコードレビューシステムGerritの変更リスト)
- Go言語のエラーハンドリングに関する一般的な情報源(Stack Overflow, ブログ記事など)