Go での再帰的エラーのラップ
Go のエラー処理メカニズムには、エラー検査用の Is() や As() などのメソッドが用意されています。ただし、これらのメソッドは再帰的エラー ラッピングをサポートしていると想定されることがよくあります。これは完全に真実ではありません。
fmt.Errorf を %w 動詞とともに使用すると、浅いエラー ラッピングのみが可能になります。真の再帰を実現するには、カスタム エラー タイプが必要です。
通常、カスタム エラー タイプには、ラップされたエラーへのポインタと、それをラップ解除するメソッドが含まれます。ただし、この方法でエラーをラップするだけでは問題が発生します。複数のラップされたエラーが同じポインターを共有する場合、Go エラーはアドレスによって比較されるため、エラー比較は失敗します。
解決策は、カスタム エラー タイプ内に Is() メソッドと As() メソッドを実装することです。これらのメソッドは、カスタム タイプ自体ではなく埋め込みエラーを比較する必要があり、アドレスベースの問題を発生させずに完全な再帰的エラー ラッピングを可能にします。
たとえば、再帰的ラッピングをサポートするエラー タイプの簡易バージョンを次に示します。
type errorChain struct { err error next *errorChain } func (c errorChain) Is(err error) bool { return errors.Is(c.err, err) } func (c errorChain) As(target any) bool { return errors.As(c.err, target) } func (c errorChain) Unwrap() error { return c.next }
このエラー タイプを使用して、必要に応じてエラーをラップすることができ、Is() と As() を使用した完全なエラー検査が可能になります。
以上がGo の `errors.Is` と `errors.As` は再帰的エラー ラッピングをサポートしていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。