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

[インデックス 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型を削除し、コードベースをクリーンアップすることを目的としています。

前提知識の解説

  1. Go言語のエラーハンドリング: Go言語では、エラーはerrorという組み込みインターフェースによって表現されます。このインターフェースは、Error() stringという単一のメソッドを持ち、エラーメッセージを文字列として返します。関数は通常、最後の戻り値としてerror型を返し、エラーが発生しなかった場合はnilを返します。これにより、呼び出し元は明示的にエラーの有無をチェックし、適切に処理することが求められます。これは、例外処理とは異なるアプローチであり、Go言語の設計思想の重要な部分です。

  2. "Vestigial" (痕跡的) なコード: 生物学における「痕跡器官」と同様に、ソフトウェア開発において「痕跡的コード」とは、かつては機能していたが、システムの進化や設計変更によってその役割を失い、もはや必要とされなくなったコードの部分を指します。このようなコードは、コンパイルエラーを引き起こさない限り、そのまま残されがちですが、コードベースの肥大化、可読性の低下、将来的な誤解やバグの原因となる可能性があるため、定期的に削除されるべきです。

  3. 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行が削除されました。

  1. // Error is the local type for a parsing error.

    • この行は、削除されるError型が「パースエラーのためのローカルな型」であることを説明するコメントです。
  2. type Error string

    • Errorという新しい型を定義しています。この型は、Goの組み込み型であるstringのエイリアス(別名)として定義されています。これにより、Error型の値は文字列として扱え、エラーメッセージを直接文字列として保持できます。
  3. func (e Error) Error() string {

    • Error型にError()というメソッドを定義しています。このメソッドは、Goのerrorインターフェースの要件を満たすために必要です。errorインターフェースは、Error() stringというシグネチャを持つメソッドを実装している任意の型によって満たされます。
  4. return string(e)

    • Error()メソッドの実装です。Error型のレシーバeを基となるstring型に変換し、その文字列値を返します。これにより、Error型の値がエラーとして扱われた際に、その文字列値がエラーメッセージとして提供されます。
  5. }

    • Error()メソッドの定義の終わりです。

これらの行が削除されたことで、regexpパッケージは独自のError型を持つことをやめ、Go言語の標準的なエラーハンドリングメカニズム(errorインターフェース)に完全に移行したことを示しています。これは、コードベースの簡素化と、Goのエラー処理のイディオムへの準拠を促進します。

関連リンク

参考にした情報源リンク

  • honeybadger.io: Go regexp package overhaul and RE2 engine.
  • stackoverflow.com: regexp/syntax package and Error types.
  • cheney.net: Go 1 error handling changes.
  • jetbrains.com: Go 1 error handling changes.