ホームページ >バックエンド開発 >Golang >Golangでの比較中にエラーが発生しました

Golangでの比較中にエラーが発生しました

王林
王林転載
2024-02-12 08:20:071070ブラウズ

在 Golang 中比较时出现错误

Golang で比較演算を実行すると、エラーが発生することがあります。これらのエラーにより、プログラムが不適切に動作したり、予期しない結果が生じたりする可能性があります。この記事では、PHP エディター イチゴの紹介を使用して、Golang で比較するときに発生する可能性のあるエラーを分析し、対応する解決策を提供します。これらの一般的なエラーを理解することで、Golang の比較演算をよりよく理解して使用できるようになり、プログラムの安定性と正確性を向上させることができます。一緒に探検しましょう!

質問の内容

今日、カスタム エラーを実装しようとして問題が発生しました。私のサービスには 2 種類のエラーがあります。内部エラーの通常のエラーと、ユーザー関連のエラーを処理するユーザー エラーです。したがって、いくつかのメタデータとエラーを処理する関数を含むユーザー エラー用の構造を用意しました。この関数では、標準エラーのラッパーを使用します。機能としては。しかし、その仕組みは奇妙です。何らかの理由で、一般的なエラーもユーザー エラーとして扱います。 コードスニペットは次のとおりです:

リーリー

ここでは、2 つのエラーを受け入れ、それらを比較する関数 (As と AsV2) をテストしています。唯一の違いは、2 番目の関数がエラー タイプではなくターゲット エラーのインターフェイスを受け入れることです。 IsUserError 関数で UserError ポインターを手動で作成し、それを Errors.As 関数に提供します。しかし、このプログラムを出力すると、次のようになります:

リーリー

それでは、私の質問は、最初の 2 つのケースでなぜエラーが発生するのかということです。つまり、同じタイプのエラーですが、正しい答えが得られるのは 3 番目のケースだけでしょうか。 Go でのインターフェイスの仕組みを誤解しているのでしょうか?

解決策

これは当てはまりません。最初の 2 つのケースでは、エラーがそれぞれ Errorinterface{} として正しく報告されます。追加した不必要なラッパー関数により間接化が作成され、さらに混乱が生じますが、次のように呼び出した場合:

リーリー

期待通りの結果が得られます。 IsUserError は、正しい型を errors.Is に渡すため、期待どおりに機能します。適切に動作するようにコードをクリーンアップしました (Error は非ポインター レシーバーを受け取り、emptyErrornil のままにしません)。それを確認してください。ここで実際の動作を確認してください: https://go.dev/play/p/c5EPB5IGeD5

リーリー

以上がGolangでの比較中にエラーが発生しましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。