[インデックス 11395] ファイルの概要
このコミットは、Go言語の標準ライブラリregexp
パッケージから、もはや使用されていない(痕跡的な)Error
型を削除するものです。これは、Go言語のエラーハンドリングの進化と、regexp
パッケージの内部実装の変更に伴うクリーンアップ作業の一環です。
コミット
- コミットハッシュ:
73ce14d0aa693f84e86dd61b3d3e862bcd4979d3
- 作者: Brad Fitzpatrick bradfitz@golang.org
- コミット日時: 2012年1月25日 14:50:37 -0800
- コミットメッセージ:
regexp: remove vestigial Error type R=golang-dev, rsc CC=golang-dev https://golang.org/cl/5573069
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/73ce14d0aa693f84e86dd61b3d3e862bcd4979d3
元コミット内容
regexp: remove vestigial Error type
変更の背景
このコミットは、Go言語がバージョン1.0のリリースに向けて開発が進められていた時期に行われたものです。Go 1.0では、エラーハンドリングのパラダイムが大きく変更され、例外ではなく明示的なerror
インターフェースを介したエラー返却が標準となりました。
regexp
パッケージもまた、この時期に大きな改修を受けています。特に、正規表現エンジンのバックエンドがGoogleのRE2エンジン(線形時間複雑度と安全性が特徴)に置き換えられました。この改修により、以前のregexp
パッケージに存在していた独自のエラー型やエラー処理メカニズムが不要となり、"痕跡的 (vestigial)" なコードとして残されていました。
このコミットは、Goのエラーハンドリングの新しいイディオムに合わせ、またregexp
パッケージの内部構造が整理された結果として、もはや使用されない古いError
型を削除し、コードベースをクリーンアップすることを目的としています。
前提知識の解説
-
Go言語のエラーハンドリング: Go言語では、エラーは
error
という組み込みインターフェースによって表現されます。このインターフェースは、Error() string
という単一のメソッドを持ち、エラーメッセージを文字列として返します。関数は通常、最後の戻り値としてerror
型を返し、エラーが発生しなかった場合はnil
を返します。これにより、呼び出し元は明示的にエラーの有無をチェックし、適切に処理することが求められます。これは、例外処理とは異なるアプローチであり、Go言語の設計思想の重要な部分です。 -
"Vestigial" (痕跡的) なコード: 生物学における「痕跡器官」と同様に、ソフトウェア開発において「痕跡的コード」とは、かつては機能していたが、システムの進化や設計変更によってその役割を失い、もはや必要とされなくなったコードの部分を指します。このようなコードは、コンパイルエラーを引き起こさない限り、そのまま残されがちですが、コードベースの肥大化、可読性の低下、将来的な誤解やバグの原因となる可能性があるため、定期的に削除されるべきです。
-
Go言語の
regexp
パッケージとRE2: Go言語の標準ライブラリregexp
パッケージは、正規表現を扱うための機能を提供します。Go 1.0のリリース前後で、このパッケージの内部実装は大きく変更されました。特に重要なのは、正規表現の評価エンジンとしてGoogleが開発したRE2ライブラリが採用されたことです。RE2は、バックトラッキングを伴わない決定性有限オートマトン(DFA)に基づく実装であり、正規表現の評価が入力文字列の長さに比例する線形時間で完了することを保証します。これにより、悪意のある正規表現(ReDoS攻撃など)によるサービス拒否攻撃を防ぐことができます。RE2の採用は、regexp
パッケージのAPIだけでなく、内部のエラー処理メカニズムにも影響を与えました。
技術的詳細
このコミットで削除されたError
型は、Go 1.0以前のregexp
パッケージで正規表現のパースエラーなどを表現するために使用されていたカスタムエラー型です。
削除されたコードは以下の通りです。
// Error is the local type for a parsing error.
type Error string
func (e Error) Error() string {
return string(e)
}
このコードは、Error
という名前の新しい型をstring
のエイリアスとして定義し、その型がerror
インターフェースを満たすようにError()
メソッドを実装しています。これは、Go言語でカスタムエラー型を定義する一般的なパターンです。
しかし、Go 1.0以降のregexp
パッケージでは、正規表現の構文解析エラーはregexp/syntax
パッケージのError
型(およびErrorCode
)によって表現され、これらは標準のerror
インターフェースに準拠しています。また、その他の実行時エラーは、fmt.Errorf
などを用いて標準のerror
インターフェースを返す形で処理されるようになりました。
したがって、このsrc/pkg/regexp/regexp.go
ファイル内に定義されていた独自のError
型は、もはやregexp
パッケージのどこからも参照されなくなり、"痕跡的"な存在となっていたため、削除されました。この削除は、コードの冗長性を減らし、Goのエラーハンドリングの標準的なプラクティスに沿ったものにするためのクリーンアップです。
コアとなるコードの変更箇所
--- a/src/pkg/regexp/regexp.go
+++ b/src/pkg/regexp/regexp.go
@@ -66,13 +66,6 @@ import (
var debug = false
-// Error is the local type for a parsing error.
-type Error string
-
-func (e Error) Error() string {
- return string(e)
-}
-
// Regexp is the representation of a compiled regular expression.
// The public interface is entirely through methods.
// A Regexp is safe for concurrent use by multiple goroutines.
コアとなるコードの解説
上記の差分が示すように、src/pkg/regexp/regexp.go
ファイルから以下の7行が削除されました。
-
// Error is the local type for a parsing error.
- この行は、削除される
Error
型が「パースエラーのためのローカルな型」であることを説明するコメントです。
- この行は、削除される
-
type Error string
Error
という新しい型を定義しています。この型は、Goの組み込み型であるstring
のエイリアス(別名)として定義されています。これにより、Error
型の値は文字列として扱え、エラーメッセージを直接文字列として保持できます。
-
func (e Error) Error() string {
Error
型にError()
というメソッドを定義しています。このメソッドは、Goのerror
インターフェースの要件を満たすために必要です。error
インターフェースは、Error() string
というシグネチャを持つメソッドを実装している任意の型によって満たされます。
-
return string(e)
Error()
メソッドの実装です。Error
型のレシーバe
を基となるstring
型に変換し、その文字列値を返します。これにより、Error
型の値がエラーとして扱われた際に、その文字列値がエラーメッセージとして提供されます。
-
}
Error()
メソッドの定義の終わりです。
これらの行が削除されたことで、regexp
パッケージは独自のError
型を持つことをやめ、Go言語の標準的なエラーハンドリングメカニズム(error
インターフェース)に完全に移行したことを示しています。これは、コードベースの簡素化と、Goのエラー処理のイディオムへの準拠を促進します。
関連リンク
- Go言語の
error
インターフェースに関する公式ドキュメント: https://go.dev/blog/error-handling-and-go - Go言語の
regexp
パッケージに関する公式ドキュメント: https://pkg.go.dev/regexp - Go 1リリースノート (エラーハンドリングの変更点など): https://go.dev/doc/go1
参考にした情報源リンク
- honeybadger.io: Go
regexp
package overhaul and RE2 engine. - stackoverflow.com:
regexp/syntax
package andError
types. - cheney.net: Go 1 error handling changes.
- jetbrains.com: Go 1 error handling changes.