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

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

コミット

Author: Russ Cox rsc@golang.org Date: Thu Oct 27 19:38:32 2011 -0700 Subject: crypto/openpgp/error: use Error in names of error impl types

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

https://github.com/golang/go/commit/6715551768cb3f5a6eadcabb197ada3f0ab77acf

元コミット内容

    crypto/openpgp/error: use Error in names of error impl types
    
    Will make gofix for error work better.
    There is no other indication in this file that
    these are actually error implementations.
    
    (They are only used elsewhere.)
    
    R=bradfitz
    CC=golang-dev
    https://golang.org/cl/5305068

変更の背景

このコミットは、Go言語のcrypto/openpgp/errorパッケージ内のエラー実装型(error implementation types)の命名規則を変更するものです。主な目的は、Go言語のコード自動修正ツールであるgofixが、これらの型をエラー型としてより適切に認識し、処理できるようにすることです。

コミットメッセージには「There is no other indication in this file that these are actually error implementations.」とあります。これは、変更前の型名(keyIncorrect, unknownIssuer)だけでは、それらがGoの標準エラーインターフェース(errorインターフェース)を実装している型であるということが、コードを読んだだけでは明確に伝わらないという問題意識があったことを示唆しています。型名にErrorというサフィックスを追加することで、その型がエラーを表すものであることを明示し、コードの可読性とツールの解析精度を向上させようとしています。

前提知識の解説

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

Go言語では、エラーは組み込みのerrorインターフェースによって表現されます。このインターフェースは非常にシンプルで、Error() stringという単一のメソッドを定義しています。

type error interface {
    Error() string
}

任意の型がこのError() stringメソッドを実装していれば、その型はerrorインターフェースを満たしているとみなされ、エラーとして扱うことができます。Goの関数は通常、最後の戻り値としてerror型を返し、エラーが発生しなかった場合はnilを返します。

gofixツール

gofixは、Go言語のソースコードを自動的に修正するためのコマンドラインツールです。Go言語の進化に伴い、APIの変更や言語仕様の変更があった際に、古いコードを新しい規約に合わせて自動的に書き換えるために使用されます。例えば、Go 1のリリース前には、APIの安定化のために多くのgofixルールが作成され、既存のコードベースを新しいAPIに移行するために利用されました。

gofixは、コードの抽象構文木(AST)を解析し、定義されたルールに基づいてコードを変換します。このコミットの背景にあるのは、gofixがエラー型を正しく識別し、それらに関連する修正(例えば、エラー型の新しい慣習的な命名への変更など)を適用できるようにするため、エラー実装型の命名に一貫性を持たせるという意図です。型名にErrorというサフィックスがあることで、gofixがより確実にそれらをエラー型として認識できるようになります。

OpenPGP

OpenPGP(Open Pretty Good Privacy)は、データの暗号化、復号化、デジタル署名、署名検証のための標準規格です。Go言語のcrypto/openpgpパッケージは、このOpenPGP標準をGoで実装したもので、暗号化通信やデジタル署名に関連する機能を提供します。このコミットで変更されているエラー型は、OpenPGPの操作中に発生する可能性のある特定のエラー(例: 署名が無効、鍵が不正、発行者が不明など)を表すものです。

技術的詳細

このコミットの技術的な詳細は、Go言語におけるエラー型の命名慣習と、それに対するgofixツールの挙動の改善に集約されます。

変更前は、crypto/openpgp/errorパッケージ内で定義されていたエラー実装型は、keyIncorrectunknownIssuerといった名前でした。これらの型は、String() stringメソッドを実装しているため、Goのerrorインターフェースを満たしていました。しかし、型名自体には「エラーである」という明示的な情報が含まれていませんでした。

このコミットでは、これらの型名をkeyIncorrectErrorunknownIssuerErrorに変更しています。これにより、型名を見ただけで、それがGoのerrorインターフェースを実装したエラー型であることが直感的に理解できるようになります。これはGo言語の慣習的な命名パターンに沿ったものであり、コードの可読性を向上させます。

さらに重要なのは、この変更がgofixツールに与える影響です。gofixのような自動修正ツールは、コードのパターンを認識して変換を行います。型名にErrorというサフィックスが付くことで、gofixはこれらの型をより確実に「エラー型」として識別できるようになります。これにより、将来的にGo言語のエラーハンドリングに関する新しい慣習やAPIの変更があった場合でも、gofixがこれらのエラー型に対して適切な自動修正を適用できるようになり、コードベースのメンテナンス性が向上します。

この変更は、error.goファイル内で定義されている型だけでなく、それらの型のインスタンスを表す変数名(KeyIncorrectError, UnknownIssuerError)にも適用されています。これにより、エラー型とそのインスタンスの命名に一貫性が保たれています。

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

--- a/src/pkg/crypto/openpgp/error/error.go
+++ b/src/pkg/crypto/openpgp/error/error.go
@@ -41,21 +41,21 @@ func (b SignatureError) String() string {
 	return "OpenPGP signature invalid: " + string(b)
 }
 
-type keyIncorrect int
+type keyIncorrectError int
 
-func (ki keyIncorrect) String() string {
+func (ki keyIncorrectError) String() string {
 	return "the given key was incorrect"
 }
 
-var KeyIncorrectError = keyIncorrect(0)
+var KeyIncorrectError = keyIncorrectError(0)
 
-type unknownIssuer int
+type unknownIssuerError int
 
-func (unknownIssuer) String() string {
+func (unknownIssuerError) String() string {
 	return "signature make by unknown entity"
 }
 
-var UnknownIssuerError = unknownIssuer(0)
+var UnknownIssuerError = unknownIssuerError(0)
 
 type UnknownPacketTypeError uint8
 

コアとなるコードの解説

このコミットでは、src/pkg/crypto/openpgp/error/error.goファイル内の2つのカスタムエラー型とその関連する変数名が変更されています。

  1. keyIncorrect 型の変更:

    • 変更前: type keyIncorrect int
    • 変更後: type keyIncorrectError int
    • この型は、OpenPGP操作において「与えられた鍵が不正である」というエラーを表します。int型を基底としていますが、重要なのはfunc (ki keyIncorrect) String() string(変更後はfunc (ki keyIncorrectError) String() string)というメソッドを実装している点です。このメソッドの実装により、keyIncorrect(またはkeyIncorrectError)型はGoのerrorインターフェースを満たし、エラーとして扱えるようになります。
    • 関連する変数KeyIncorrectErrorも、型名の変更に合わせてvar KeyIncorrectError = keyIncorrectError(0)に変更されています。これは、keyIncorrectError型のゼロ値を持つインスタンスであり、特定の「鍵が不正」エラーを表すために使用されます。
  2. unknownIssuer 型の変更:

    • 変更前: type unknownIssuer int
    • 変更後: type unknownIssuerError int
    • この型は、OpenPGP署名が「不明なエンティティによって作成された」というエラーを表します。同様に、func (unknownIssuer) String() string(変更後はfunc (unknownIssuerError) String() string)メソッドを実装することでerrorインターフェースを満たしています。
    • 関連する変数UnknownIssuerErrorも、型名の変更に合わせてvar UnknownIssuerError = unknownIssuerError(0)に変更されています。これは、unknownIssuerError型のゼロ値を持つインスタンスであり、特定の「発行者不明」エラーを表すために使用されます。

これらの変更は、型名にErrorというサフィックスを追加することで、その型がGoのerrorインターフェースを実装していることを明示し、コードの可読性を高めるとともに、gofixのような自動修正ツールがこれらのエラー型をより正確に識別できるようにすることを目的としています。

関連リンク

  • Go CL 5305068: https://golang.org/cl/5305068

参考にした情報源リンク