ホームページ > バックエンド開発 > Golang > Golang 関数 defer ステートメントの使用状況分析

Golang 関数 defer ステートメントの使用状況分析

WBOY
リリース: 2023-05-16 11:21:27
オリジナル
1080 人が閲覧しました

Golang は、同時実行をサポートし、マシンコードにコンパイルされるオブジェクト指向プログラミング言語で、単純な構文、効率的なパフォーマンス、豊富な標準ライブラリを備えています。 Golang では、関数の実行を遅らせるために defer ステートメントが使用され、この言語機能はコードを記述するときに非常に役立ちます。この記事では、Golang関数のdefer文の使い方と解析について解説します。

1. defer ステートメントの基本構文

Golang では、defer ステートメントを使用して、関数が戻るまで関数またはメソッドの実行を延期できます。 defer ステートメントの構文は非常に単純で、構文形式は次のとおりです:

defer 函数名(参数列表)
ログイン後にコピー

ここで、defer は Golang 言語のキーワードです。 defer ステートメントはどこでも使用できますが、関数またはメソッドの実行プロセスをより明確に表示できるように、関数またはメソッドの先頭で宣言することをお勧めします。

2. defer 文の実行原理

関数を実行する際、関数内に defer 文がある場合、その defer 文は定義順に逆順に実行されます。つまり、それらは最後に定義されます。 defer ステートメントが最初に実行され、最初に定義された defer ステートメントが最後に実行されます。 defer ステートメントには後入れ先出しロジックがあります。

たとえば、次のコードは単純な defer ステートメントの例を実装しています。

package main

import (
    "fmt"
)

func main() {
    defer fmt.Println("defer 1")
    defer fmt.Println("defer 2")
    defer fmt.Println("defer 3")

    fmt.Println("Hello, Golang!")
}
ログイン後にコピー

出力結果は次のとおりです。

Hello, Golang!
defer 3
defer 2
defer 1
ログイン後にコピー

ご覧のとおり、 fmt.Println("Hello , Golang!") を実行し、後入れ先出しロジックに基づいて 3 つの defer ステートメントを実行しました。

3. defer ステートメントの適用シナリオ

defer ステートメントは Golang 言語で非常に一般的に使用され、次のシナリオで使用できます:

  1. ファイルを閉じる

Golang を使用してファイルを操作する場合、ファイルオープン操作が完了したらすぐにファイルを閉じる必要があるため、直接 Close() 関数を使用すると、予期せぬエラーが発生した場合にファイルが閉じられない可能性があります。この状況は、プログラムの実行中に発生します。このとき、defer ステートメントを使用して、関数が終了するまで Close() 関数の実行を遅らせ、ファイルを正常に閉じることができるようにすることができます。以下は関連するコードです。例:

file, err := os.Open("test.txt")
if err != nil {
    fmt.Println(err)
}
defer file.Close()
ログイン後にコピー
  1. ロック解除操作

Golang では、sync.Mutex を使用してミューテックス ロックを制御し、関数の最後にロックを解放します。 defer ステートメントを使用して、プログラムのデッドロックを回避します。以下はサンプル コードです:

var mutex sync.Mutex

func sample() {
    mutex.Lock()
    defer mutex.Unlock()

    // 操作代码
}
ログイン後にコピー
  1. 関数の実行時間を計算する

Golang 関数のパフォーマンスをテストするときに、次のことができます。関数の実行前後の時間を記録し、その時間差を計算して関数の実行時間を取得します。時刻が関数内で直接計算される場合、多くのコード ロジックによりタイムスタンプがさまざまな場所で取得される可能性があり、デバッグが複雑になります。このとき、defer文を使用することで関数終了時の時間差を計算し、関数の実行時間を求めることができます。

import (
    "time"
)

func calcExecTime() {
    startTime := time.Now().UnixNano()
    defer func() {
        fmt.Println("time", float32(time.Now().UnixNano()-startTime)/1000000.0)
    }()

    // 操作代码
}
ログイン後にコピー

4. defer 文の注意点

defer 文を使用する場合は、以下の点に注意する必要があります。ステートメントは現在の関数内に存在するか、メソッドが終了する前に実行されるため、関数またはメソッドの内部状態を変更する関数またはメソッド内のコードはすべて、defer の実行時にも有効になります。

    defer ステートメントは通常、ファイルを閉じたりメモリを解放したりするなど、一部のリソースをクリーンアップするために使用されるため、適切なタイミングで defer ステートメントを使用するようにしてください。
  1. defer ステートメントを使用する場合は、プログラムのパフォーマンスに影響を与える可能性がある、大規模なループやデータベースへの接続など、負荷の高いコードを含む関数の使用を避ける必要があります。
  2. 5. 概要
Golang では、defer ステートメントを使用して、関数が戻るまで関数またはメソッドの実行を延期できます。 defer ステートメントは Golang 言語で非常に一般的に使用され、ファイルのクローズ、操作のロック解除、関数の実行時間の計算に使用できます。defer ステートメントを使用する場合は、プログラムのパフォーマンスへの影響を防ぐために、高価なコードを含む関数の使用を避ける必要があります。 。

以上がGolang 関数 defer ステートメントの使用状況分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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