はじめに
本記事では、Go言語のdefer
について、基本的な特徴を3点紹介します!
deferの特徴
1. 関数の実行を遅延させる
deferは、Goのキーワードの一つで、関数の実行を遅延させるために使用されます。具体的には呼び出し元の関数が終了する直前に、指定した関数を実行することができます。これによって、リソースの解放や後処理を簡潔に行うことができます!
例えば、以下のソースコードを見てください:
package main
import (
"fmt"
)
func main() {
fmt.Println("A")
defer fmt.Println("B")
fmt.Println("C")
}
このコードの実行結果は次のようになります:
A
C
B
deferを使った行は、関数の終わりに実行されるため、B
が最後に出力されます。
2. deferの関数の実行順序はLIFO(後入れ先出し)
複数のdeferを使うとどうなるでしょうか?次のソースコードを見てください:
package main
import (
"fmt"
)
func main() {
defer fmt.Println("0")
defer fmt.Println("1")
defer fmt.Println("2")
fmt.Println("Main")
}
このコードの実行結果は次のようになります:
Main
2
1
0
複数のdeferがある場合、後から宣言されたものが先に実行されます。これはスタックのようにLIFO(後入れ先出し)で実行される為です。
3. 引数の評価タイミングはdeferの宣言時
次に、deferと関数の引数の評価タイミングについてです。次のソースコードを見てください:
package main
import (
"fmt"
)
func printMessage(message string) {
fmt.Println(message)
}
func main() {
msg := "Hello"
defer printMessage(msg)
msg = "Goodbye"
}
このコードの出力はHello
でしょうか?、Goodbye
でしょうか?
実行結果は次のようになります:
Hello
deferによって遅延実行されるのは関数自体であり、引数はその場で評価されます。その為、deferを宣言した時点のHello
が出力されます。
まとめ
deferの基本的な特徴を3点紹介しました。deferはリソース管理や後処理を簡潔に行うことができます。是非、皆さんも活用してみてください!