Go がエラー ラッパーへのポインターを返すのに、それを「*error」ではなく「error」で宣言するのはなぜですか

WBOY
リリース: 2024-02-09 22:40:10
転載
554 人が閲覧しました

为什么 Go 返回一个指向错误包装器的指针,但用“error”而不是“*error”声明它

Go がエラー ラッパーへのポインターを返すのに、それを「error」ではなく「error」で宣言するのはなぜですか?これは、多くの Go 言語開発者が遭遇する一般的な問題です。簡単に言えば、Go がエラーを返す方法は、エラーの使用と処理を容易にすることです。 Go では、エラーはエラー メッセージを返す Error() メソッドを持つインターフェイス タイプです。したがって、関数がエラーを返すと、実際には Error() メソッドを実装する構造体へのポインタが返されます。この設計により、エラー処理がより簡潔かつ柔軟になり、コードの冗長性と複雑さが軽減されます。したがって、ポインターを返すのは奇妙に思えるかもしれませんが、実際には、より優れたエラー処理を提供することを目的としています。

質問内容

JavaのバックグラウンドからGo言語を学んでいます。

リーリー

上記のコードで、myFunction のエラー タイプが "*error" ではなく "error" になっている理由がわかりません。以下の行では明らかに MyError 構造体へのポインタを返しています。

main 関数のエラーをポインターにアサートできる理由も理解しました。

解決策

Go での従来のエラー処理を理解するには、まず言語のインターフェイスがどのように機能するかを理解する必要があります。 Go インターフェースについて話すときに覚えておくべきことが 2 つあります:

  1. Go のインターフェイスは、一連のメソッドを定義します (Go1.18 以降は一連の型も定義します)。バックグラウンドで、Go インターフェイスには、タイプ T と値 V という 2 つの要素が含まれています。 V 常に はインターフェイス自体ではなく、intstruct、またはポインターなどの具象型です。

  2. Go には implements キーワードはありません。 Go タイプは、そのメソッドを実装することでこのインターフェイスを満たすことができます。これは、 暗黙的 実装と呼ばれます。

###エラー処理###

Go は組み込みの

error

型を定義します。これは単なるインターフェイスです: リーリー 実際には、これがグローバルな

事前宣言型

であることを除けば、特別なことは何もありません。このタイプは通常、エラー処理に使用されます。 あなたの例を挙げてみましょう:

リーリー

#MyError

へのポインターと

error インターフェイス間の関係はバックグラウンドで行われるため、## から明示的に *error を返す必要はありません。 # MyError 値参照 error (実際、 インターフェイスへのポインターは ほとんど必要ありません )。 myFunction を返した後、error 値には次のタプルが保持されます

(V=&MyError{message: "my error message", Offset: 0}, T= * MyError)

V はその値保持、T は値 V のタイプです。 Go ではインターフェイス値にアサーションを入力できるためです。基本的に、e, ok := err.(*MyError) について質問している Go 操作は、 err 値 (この型は

error

です)インターフェース) 型 #MyError はその基礎となる T を持っていますか?その場合、oktrue になり、e はその基礎となる V 値を受け取ります。メッセージは「、オフセット: 0}」です。 : nil エラー値は、インターフェイスの微妙な違いにより、常に期待通りに動作するとは限らないため、慎重に扱ってください。

以上がGo がエラー ラッパーへのポインターを返すのに、それを「*error」ではなく「error」で宣言するのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!