Golang で比較演算を実行すると、エラーが発生することがあります。これらのエラーにより、プログラムが不適切に動作したり、予期しない結果が生じたりする可能性があります。この記事では、PHP エディター イチゴの紹介を使用して、Golang で比較するときに発生する可能性のあるエラーを分析し、対応する解決策を提供します。これらの一般的なエラーを理解することで、Golang の比較演算をよりよく理解して使用できるようになり、プログラムの安定性と正確性を向上させることができます。一緒に探検しましょう!
今日、カスタム エラーを実装しようとして問題が発生しました。私のサービスには 2 種類のエラーがあります。内部エラーの通常のエラーと、ユーザー関連のエラーを処理するユーザー エラーです。したがって、いくつかのメタデータとエラーを処理する関数を含むユーザー エラー用の構造を用意しました。この関数では、標準エラーのラッパーを使用します。機能としては。しかし、その仕組みは奇妙です。何らかの理由で、一般的なエラーもユーザー エラーとして扱います。 コードスニペットは次のとおりです:
リーリーここでは、2 つのエラーを受け入れ、それらを比較する関数 (As と AsV2) をテストしています。唯一の違いは、2 番目の関数がエラー タイプではなくターゲット エラーのインターフェイスを受け入れることです。 IsUserError 関数で UserError ポインターを手動で作成し、それを Errors.As 関数に提供します。しかし、このプログラムを出力すると、次のようになります:
リーリーそれでは、私の質問は、最初の 2 つのケースでなぜエラーが発生するのかということです。つまり、同じタイプのエラーですが、正しい答えが得られるのは 3 番目のケースだけでしょうか。 Go でのインターフェイスの仕組みを誤解しているのでしょうか?
これは当てはまりません。最初の 2 つのケースでは、エラーがそれぞれ Error
と interface{}
として正しく報告されます。追加した不必要なラッパー関数により間接化が作成され、さらに混乱が生じますが、次のように呼び出した場合:
期待通りの結果が得られます。 IsUserError
は、正しい型を errors.Is
に渡すため、期待どおりに機能します。適切に動作するようにコードをクリーンアップしました (Error
は非ポインター レシーバーを受け取り、emptyError
を nil
のままにしません)。それを確認してください。ここで実際の動作を確認してください: https://go.dev/play/p/c5EPB5IGeD5
以上がGolangでの比較中にエラーが発生しましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。