ホームページ > バックエンド開発 > Golang > Go の「defer」キーワードはリソース管理とパニック処理をどのように簡素化しますか?

Go の「defer」キーワードはリソース管理とパニック処理をどのように簡素化しますか?

Linda Hamilton
リリース: 2024-12-14 14:12:15
オリジナル
572 人が閲覧しました

How Does Go's `defer` Keyword Simplify Resource Management and Panic Handling?

Go での defer の使用

Go の defer キーワードを使用すると、周囲の関数が戻る直前に関数を実行でき、アクションが確実に実行されます。

関数に配置されたコードよりも遅延する利点End

  • 信頼性の高いリソースの割り当て解除/割り当て:
    遅延により、関数がパニックになったり突然戻ったりした場合でも、ファイルのクローズなどのリソースのクリーンアップが保証されます。
  • パニック対応:
    遅延関数は、recover() を呼び出すことでパニックを処理できます。これにより、カスタムのエラー処理と回復が可能になります。
  • 制御された実行順序:
    遅延呼び出しは逆の順序でスタックされ、周囲の関数の戻り時に実行され、リソースの割り当てを解除する決定的な方法が提供されます。 .
  • ネストされたスコープなし:
    try-catch-finally ブロックとは異なり、defer はネストされたスコープを回避することで周囲の関数の構造を簡素化します。

例:

  • Try-finally リソースクリーンアップ:

    func main() {
        f, err := os.Create("file")
        if err != nil {
            panic("cannot create file")
        }
        defer f.Close()
        fmt.Fprintf(f, "hello")
    }
    ログイン後にコピー
  • パニック処理で最終的にトライキャッチ:

    func main() {
        defer func() {
            msg := recover()
            fmt.Println(msg)
        }()
        f, err := os.Create(".") // . is the current directory
        if err != nil {
            panic("cannot create file")
        }
        defer f.Close()
        fmt.Fprintf(f, "hello")
    }
    ログイン後にコピー
  • 修正されたリターン値:

    func yes() (text string) {
        defer func() {
            text = "no"
        }()
        return "yes"
    }
    
    func main() {
        fmt.Println(yes()) // Prints "no"
    }
    ログイン後にコピー

要約すると、Go の defer は、ネストされたブロック構造を必要とせずに、リソースのクリーンアップを確実にし、パニックを処理し、実行順序を制御する柔軟な方法を提供します。

以上がGo の「defer」キーワードはリソース管理とパニック処理をどのように簡素化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート