defer関数の使い方
defer関数とは特定の処理を最後、もしくは後で実行することができます。
つまり、Golangにおいて遅延処理を行いたい場合によく使われます。
書き方としては、遅らせたい処理の前にdeferと宣言するだけで使えます。
defer 処理
defer 関数
具体的なコード例
以下のようにシンプルな例だと、deferが付けられた処理が最後に実行されるだけです。
package main
import "fmt"
func main() {
defer fmt.Println("後で実行される")
fmt.Println("先に実行される")
}
出力結果
先に実行される
後で実行される
関数にdeferをつける場合
deferは関数に対しても宣言することができ、deferが付けられた関数は遅延処理を行います。
例えば、次のようにdeferのないコードの場合、sayA関数の中ではsayB関数が先に呼ばれ、その後に”aaa”を出力する処理が実行されます。
package main
import (
"fmt"
)
func main() {
sayA()
}
func sayA() {
sayB()
fmt.Println("aaa")
}
func sayB() {
fmt.Println("bbb")
}
実行結果
bbb
aaa
しかし、sayB関数を呼び出す際にdeferをつけると、”aaa”を出力した後にsayB関数が実行されます。
package main
import (
"fmt"
)
func main() {
sayA()
}
func sayA() {
defer sayB() // deferをつける
fmt.Println("aaa")
}
func sayB() {
fmt.Println("bbb")
}
実行結果は以下の通り
aaa
bbb
deferが複数ある場合
deferが複数箇所で存在する場合は、deferが後から呼ばれた順に処理が実行されます。
なので、一番最初に宣言されたdeferの処理が一番最後に実行されるということです。
package main
import "fmt"
func main() {
defer fmt.Println("最後に実行される")
defer fmt.Println("3番目に実行される")
defer fmt.Println("2番目に実行される")
fmt.Println("最初に実行される")
}
出力結果
最初に実行される
2番目に実行される
3番目に実行される
最後に実行される