Go言語(golang)のdefer
deferの使い方を説明します。Tour of Goを参考にしています。
deferを使えば関数の終了時に任意の処理を実行できます。
Go言語(golang)のdeferの使い方
defer
は、Golangにおいて関数の実行を遅延させるためのキーワードです。defer
を使うことで、指定した処理を関数が終了する際に実行することができます。主に、リソースの解放やクリーンアップ、エラーハンドリングのために使用されます。
defer
を使用すると、指定された関数呼び出しが遅延され、関数内での処理が終了した後に実行されます。以下は基本的な使用例です。
package main
import "fmt"
func main() {
fmt.Println("処理開始")
// 関数終了時に実行される
defer fmt.Println("処理終了")
// 通常の処理
fmt.Println("メインの処理")
}
この例では、defer
を使ってfmt.Println("処理終了")
を関数の最後に遅延させています。実行すると、以下のような出力が得られます。
処理開始
メインの処理
処理終了
defer
は複数回使用でき、遅延された関数呼び出しは後で登録されたものから逆順に実行されます。以下は複数のdefer
の例です。
package main
import "fmt"
func main() {
defer fmt.Println("最後に実行される")
defer fmt.Println("これは後で実行される")
fmt.Println("最初に実行される")
}
この例では、3つのfmt.Println
が登録されていますが、defer
によって最後に登録されたものから順に実行されます。出力は次のようになります。
最初に実行される
これは後で実行される
最後に実行される
defer
は、ファイルのクローズやロックの解放など、遅延されたタイミングで行いたい後始末作業に便利です。
defer注意点: 遅延された関数の引数の評価
defer
に渡す関数の引数は、defer
文が実行される時点で評価されます。そのため、引数が関数内で変更されてしまう場合、defer
に渡された関数には変更前の値が渡されることになります。
func main() {
x := 5
defer fmt.Println("Deferred:", x)
x = 10
fmt.Println("Not deferred:", x)
}
この例では、Deferred: 5
とNot deferred: 10
が出力されます。defer
に渡す関数は遅延されるため、x
が変更される前の値が出力されています。
defer注意点: deferの順序
defer
文はスタックで管理され、後で登録されたものから逆順に実行されます。このため、関数内で複数のdefer
がある場合、適切な順序で実行されるように注意する必要があります。
func main() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
}
この例では、3
, 2
, 1
の順で出力されます。