ホームページ >バックエンド開発 >Golang >遅延関数は Go の `log.Fatalln` の後に実行されますか?

遅延関数は Go の `log.Fatalln` の後に実行されますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-04 16:24:16218ブラウズ

Do Deferred Functions Execute After `log.Fatalln` in Go?

Log.Fatalln と遅延関数の実行

Go プログラムでは、外側の関数が返されると、遅延関数が自動的に呼び出されます。ただし、一般的な疑問が生じます: log.Fatalln 関数が呼び出されたときに遅延関数は実行されますか?

log.Fatalln について

log.Fatalln 関数はメンバーです標準の Go ロギング パッケージの。提供されたメッセージをログに記録し、すぐに os.Exit(1) を呼び出してプログラムを終了します。 os.Exit 関数は、遅延関数の実行を防ぎます。

log.Fatalln の場合の遅延関数の実行

したがって、質問はいいえです。 log.Fatalln が呼び出された場合、遅延関数は実行されません。これは、log.Fatalln が遅延関数の実行をバイパスしてプログラムを突然終了するためです。

この動作は、log.Fatalln:

Fatal is equivalent to Print() followed by a call to os.Exit(1).
と同等の関数である log.Fatal の説明に文書化されています。

実践的なデモンストレーション

次のコード

db, err := sql.Open("postgres", "…")
if err != nil {
    log.Fatalln(err)
}
defer db.Close()

tpl, err := template.ParseGlob("")
if err != nil {
    log.Fatalln(err)
}

template.ParseGlob("") がエラーを返した場合、log.Fatalln がその行に到達する前にプログラムを終了するため、db.Close() への呼び出しは実行されません。

代替アプローチ

クリーンアップ タスクを確実に実行する必要がある場合プログラムが終了する前に実行される場合は、プログラムを終了しない他のログ機能 (log.Print や log.Println など) の使用を検討する必要があります。

以上が遅延関数は Go の `log.Fatalln` の後に実行されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。