Go がエラー ラッパーへのポインターを返すのに、それを「error」ではなく「error」で宣言するのはなぜですか?これは、多くの Go 言語開発者が遭遇する一般的な問題です。簡単に言えば、Go がエラーを返す方法は、エラーの使用と処理を容易にすることです。 Go では、エラーはエラー メッセージを返す Error() メソッドを持つインターフェイス タイプです。したがって、関数がエラーを返すと、実際には Error() メソッドを実装する構造体へのポインタが返されます。この設計により、エラー処理がより簡潔かつ柔軟になり、コードの冗長性と複雑さが軽減されます。したがって、ポインターを返すのは奇妙に思えるかもしれませんが、実際には、より優れたエラー処理を提供することを目的としています。
JavaのバックグラウンドからGo言語を学んでいます。
リーリー上記のコードで、myFunction のエラー タイプが "*error" ではなく "error" になっている理由がわかりません。以下の行では明らかに MyError 構造体へのポインタを返しています。
main 関数のエラーをポインターにアサートできる理由も理解しました。
Go での従来のエラー処理を理解するには、まず言語のインターフェイスがどのように機能するかを理解する必要があります。 Go インターフェースについて話すときに覚えておくべきことが 2 つあります:
Go のインターフェイスは、一連のメソッドを定義します (Go1.18 以降は一連の型も定義します)。バックグラウンドで、Go インターフェイスには、タイプ T
と値 V
という 2 つの要素が含まれています。 V
常に はインターフェイス自体ではなく、int
、struct
、またはポインターなどの具象型です。
Go には implements
キーワードはありません。 Go タイプは、そのメソッドを実装することでこのインターフェイスを満たすことができます。これは、 暗黙的 実装と呼ばれます。
型を定義します。これは単なるインターフェイスです:
リーリー
実際には、これがグローバルな
であることを除けば、特別なことは何もありません。このタイプは通常、エラー処理に使用されます。 あなたの例を挙げてみましょう:
リーリー#MyError
へのポインターとerror インターフェイス間の関係はバックグラウンドで行われるため、## から明示的に
*error を返す必要はありません。 # MyError
値参照 error
(実際、 インターフェイスへのポインターは
ほとんど必要ありません )。
myFunction を返した後、error 値には次のタプルが保持されます
、V
はその値保持、T
は値 V
のタイプです。
Go ではインターフェイス値にアサーションを入力できるためです。基本的に、e, ok := err.(*MyError)
について質問している Go 操作は、 err
値 (この型は
です)インターフェース) 型 #MyError
はその基礎となる T
を持っていますか?その場合、ok
は true
になり、e
はその基礎となる V
値を受け取ります。メッセージは「、オフセット: 0}」です。
注
:
nil エラー値は、インターフェイスの微妙な違いにより、常に期待通りに動作するとは限らないため、慎重に扱ってください。
以上がGo がエラー ラッパーへのポインターを返すのに、それを「*error」ではなく「error」で宣言するのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。