ホームページ > バックエンド開発 > Golang > golang defer とはどういう意味ですか?

golang defer とはどういう意味ですか?

PHPz
リリース: 2023-04-23 15:18:05
オリジナル
685 人が閲覧しました

Golang では、defer ステートメントは、現在の関数またはメソッド ブロックが実行されるまで関数またはメソッドの実行を延期するために使用されます。これは、プログラマが多くのシナリオでリソースの解放や例外処理などの重要な操作を完了するのに役立つ、非常に便利な言語構造です。

defer ステートメントは、次のシナリオを処理するために使用できます:

1. リソースの解放

ファイル、ネットワーク接続、データベース接続などのリソースを処理するとき、リソースの漏洩を避けるために、使用後にそれらを解放する必要があります。 時間内に解放してください。 defer ステートメントを使用すると、現在の関数の実行後にリソースを解放するロジックを自動的に実行できるため、プログラマの負担が軽減されます。例:

func readFromFile(filename string) ([]byte, error) {
    f, err := os.Open(filename)
    if err != nil {
        return nil, err
    }

    defer f.Close() // 在函数执行完毕后释放文件资源

    data, err := ioutil.ReadAll(f)
    if err != nil {
        return nil, err
    }

    return data, nil
}
ログイン後にコピー

2. 例外回復

関数を実行すると例外が発生し、関数が正常に終了できない場合があります。例外によるプログラムのクラッシュを回避するために、defer ステートメントを使用して、関数内で例外が発生したときに必要な例外処理を実行できます。例:

func doSomething() error {
    tx, err := db.Begin()
    if err != nil {
        return err
    }

    defer func() {
        if p := recover(); p != nil { // 发生异常时处理事务回滚
            tx.Rollback()
            log.Println("panic:", p)
        }
    }()

    // 在函数执行完毕前提交事务
    err = tx.Commit()
    if err != nil {
        return err
    }

    return nil
}
ログイン後にコピー

上記のコードでは、関数がトランザクションをコミットするときに例外が発生した場合、defer ステートメントは例外をキャプチャし、トランザクションのロールバック操作を実行してデータの整合性を確保します。

3. パフォーマンス分析

プログラムの実行中にパフォーマンス分析を実行すると非常に便利です。関数の実行時間は、関数の最初と最後にタイムスタンプを出力することで計算できます。例:

func myFunc() {
    defer func() {
        log.Printf("myFunc took %v", time.Since(start))
    }()

    start := time.Now()

    // 函数的具体实现

    return
}
ログイン後にコピー

上記のコードでは、関数の開始時に現在時刻を記録し、関数の終了時に時間差を計算して関数の実行時間を計算します。

つまり、defer ステートメントは、プログラマーがコードの実装を簡素化し、いくつかの一般的なシナリオを処理するのに役立つ、Golang の非常に実用的な言語構造です。 defer ステートメントを使用する場合、コードの信頼性と一貫性を確保するために、例外やリソースの解放などの操作を慎重に処理する必要があることに注意してください。

以上がgolang defer とはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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