11

Go はアサーションを提供しません。それらは間違いなく便利ですが、私たちの経験では、プログラマーが適切なエラー処理とレポートについて考えないようにするための松葉杖としてそれらを使用しています。

ただし、print と printlnがあります。

印刷のようなパニック、印刷後に
実行を中止します。

それはアサートと同じことではありませんか?なぜ彼らは上記のことを主張するのにパニックに陥るのでしょうか? 私はそれが同じ問題につながるのを見ることができますが、簡単に悪用される可能性のあるエラーメッセージを最後に追加します. 何か不足していますか?

4

3 に答える 3

16

いいえ、ちがいます。パニックは「書き込み後に中止」のようなものですが、アサートは「テストして偽の場合は書き込み後に中止」のようなものです。とにかく、アサートのようなステートメントを実行できないようにする方法はありません。

于 2010-01-29T21:57:50.683 に答える
2

Goでは、パニックが発生した場合panicでもassert、メカニズムを使用してエラー処理を行うことができます。

パッケージから回復できない何かが発生したと考えると、パニックが発生します。

ただし、パッケージ ユーザーである呼び出し元 (親レベル) は、パニックを検査またはログに記録してからパニックを継続するか、ケースを適切に処理するためにキャッチすることができます (たとえば、再試行するか、別のパッケージ/関数を使用します)。 )。

また、assert-abort はデストラクタなどを呼び出しません。ただし、Go のパニックは、実行される関数でさえも呼び出すdeferため、すべてがクリーンアップされます。

ご覧のとおり、パニックでは、アサートとは対照的に、さまざまなクリーンアップ タスクが可能になります。それはあなたが与えた引用が指していたものです.

defer、panic、recover の詳細については、それらに関する公式ブログ投稿を参照してください。

于 2011-06-11T20:08:26.570 に答える
1

1 つは、C ではassert()、デバッグ モードの場合にのみ実行を中止します。

于 2010-01-29T21:47:29.393 に答える