ここでは、Goの遅延実行というものを扱います。
Go言語では、deferキーワードを用いることで特定の処理を遅らせて実行することができます。
defer
それではdeferを使ってみましょう。
deferキーワードを関数内で用いることで特定の処理を一番最後に実行するという仕組みになっています。
具体的なコードで見て行きましょう。
まずは単純なコードを用意してみました。
package main
import "fmt"
func main() {
fmt.Println("ただいま勉強中!")
fmt.Println("Go言語をやっています。")
}
ここではdeferは使ってません。
単にmain()関数の中で、Println()を順番に出力しています。
ただいま勉強中!
Go言語をやっています。
main()関数の上から順番にPrintln()を出力しているのがわかります。
これを次のようにdeferを使ってみましょう。
package main
import "fmt"
func main() {
defer fmt.Println("ただいま勉強中!")
fmt.Println("Go言語をやっています。")
}
Println()の上側のコードに、deferを付けています。
このdeferを付けた部分が遅延実行されるということになります。
実行するとこうなります。
Go言語をやっています。
ただいま勉強中!
先ほどと違って、出力の順番が逆になっているのがわかります。
では、deferを複数個使った場合はどうなるでしょうか?
次のようなコードで確認してみます。
package main
import "fmt"
func main() {
fmt.Println("A")
defer fmt.Println("B")
defer fmt.Println("C")
defer fmt.Println("D")
fmt.Println("E")
}
Printin()での出力を5つ並べています。
その中の真ん中の3つにdeferを使っています。
deferを使っていないならば、A、B、C、D、Eと順に出力されますが、この場合はどうなるでしょう。
実行するとこうなります。
A
E
D
C
B
deferのついてない部分が上から順に実行され、deferのついた部分は上からではなく下から実行されているのがわかります。
このように複数のdeferは下から実行されることに注意です。最後に一番上のdeferが実行されるということになります。この位置にファイル処理などでファイルを閉じるなどのコードを置くと行ったことが考えられます。
ここまでは、関数の中での処理でdeferを使って来ましたが、今度は別の関数を呼び出した時の場合を見て行きます。
package main
import "fmt"
func example() {
defer fmt.Println("ただいま勉強中!")
fmt.Println("Go言語をやっています")
}
func main() {
defer example()
fmt.Println("Hello Golang!")
}
関数を別に定義しています。
その関数をmain()関数で呼び出していますが、それにdeferを使っているのがわかります。
実行するとこうなります。
Hello Golang!
Go言語をやっています
ただいま勉強中!
deferの処理の順番が確認できると思います。
最後に
ここではGo言語のdeferを使って遅延実行をやってみました。
deferキーワードを関数内で用いることで特定の処理を一番最後に実行することができます。
関数内の処理だけでなく、呼び出した関数もdeferを使うことによって、処理の順番を遅らせることができます。
deferは最後に実行させるコードなどがある時などに利用できます。