【Golang】defer関数の使い方をGoエンジニアが優しく解説!

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番目に実行される
最後に実行される

タイトルとURLをコピーしました