誰かがos.Exit()
とpanic()
の主な違いと、Goでの実際の使用方法を説明できますか?
まず、「実際にどのように使用されるか」という質問がある場合、開始する良い方法は 検索 Goソースコード(または、十分に大きいGoコードベース)です。 パッケージドキュメント 回答。
現在、os.Exit
とpanic
はまったく異なります。 panic
は、プログラムまたはその一部が回復不能な状態になったときに使用されます。
panic
が呼び出されると、境界外のスライスのインデックス付けや型アサーションの失敗などの実行時エラーを暗黙的に含み、現在の関数の実行を直ちに停止し、途中で遅延関数を実行してゴルーチンのスタックを巻き戻します。その巻き戻しがゴルーチンのスタックの最上部に達すると、プログラムは終了します。
os.Exit
は、プログラムを中止する必要がある場合すぐに、回復または遅延クリーンアップステートメントを実行する可能性がない場合に使用されます。エラーコードを返します(他のプログラムが何が起きたかを報告するために使用できます)。これはテストで役立ちます。この1つのテストが失敗すると、もう1つのテストも失敗することが既にわかっているため、今すぐ終了することもできます。これは、プログラムが必要なことをすべて完了し、終了する必要があるとき、つまりヘルプメッセージを出力した後にも使用できます。
ほとんどの場合、panic
を使用せず(代わりにerror
を返す必要があります)、テストやプログラムの迅速な終了のために、os.Exit
はほとんど必要ありません。
まず第一に、os.Exit()
はエラーなしでプログラムを正常に終了するために使用でき、パニックにならないため、1つの重要な違いです。もう1つは、recover
を使用して、どこかでパニックをキャッチして無視またはログに記録できることです。
しかし、誤った終了コードについて話している場合は、次のように言ってみましょう。
何かが恐ろしくうまくいかないときはおそらくpanic
を使用してください。おそらく本番に進む前にキャッチすべきプログラマーのエラーです。これがスタックを印刷する理由です。
必要に応じて、os.Exit(errorCode)
またはそのようなものを使用します。
スクリプト作成のためにプログラムの終了コードを制御します。
予想されるエラー(ユーザー入力エラーなど)で正常に終了したい。
基本的にパニックはあなたのためであり、悪い終了コードはあなたのためです。
主な違いは次のとおりです。
os.Exit
は、遅延関数の実行をスキップします。os.Exit
を使用すると、終了コードを指定できます。panic
は終了していますが、os.Exit
は終了していません。 (他の答えはこれに言及していないようです。)遅延関数を実行する必要がある場合、panic
以外の選択肢はありません。 (一方、遅延関数の実行をスキップする場合は、os.Exit
を使用します。)
非void関数が次のように定義されている場合:
return
またはpanic
で終了しますその場合、panic
をos.Exit
に置き換えることはできません。そうしないと、コンパイラーはプログラムのコンパイルを拒否し、「関数の終わりに戻りがありません」と言います。 (Goはここでは非常に馬鹿です。log.Panic
でさえ関数を終了しません。)
その他の条件の場合:
panic
を使用します。プログラミング論理エラー。os.Exit
を使用します。