プログラムを制御せよ!Defer!(Go言語)
本日は,Goのdeferについてです.
deferの意味は,「延期する.先延ばしにする.」と言った意味があります.
さて,Goのdeferとはどのようなものなのでしょうか?
ちなみに,本投稿もdeferしておりますw
説明用のコード
本日の説明用のコードはこちらです.
package main
import (
"fmt"
)
func main() {
defer1()
defer2()
}
func defer1() {
defer fmt.Println("World")
fmt.Print("Hello")
fmt.Print(",")
}
func defer2() { /* deferはスタックされる! */
defer fmt.Println()
for i := 0; i < 10; i++ {
defer fmt.Print(" ", i+1)
}
fmt.Println("Count down start !")
}
本コードは,下記のサイトで実行できます.
Deferの先延ばし
まずこちらのコードを見てください.
func defer1() {
defer fmt.Println("World")
fmt.Print("Hello")
fmt.Print(",")
}
このコードが実行されると,結果はこちらになります.
Hello,World
びっくりですね.「WorldHello,」になるのかと思いきや,ちゃんと「Hello,World」となっています.
これが,Deferです!
fmt.Println("World")の実行が先延ばしにされております!
deferで指定した関数は,その親関数(ここでは,defer1関数)の実行が終了する直前に呼び出されます!
Deferが複数だとどうなる?
さてさて,一つの関数の中で,複数回Deferするとどうなるのでしょうか?
func defer2() { /* deferはスタックされる! */
defer fmt.Println()
for i := 0; i < 10; i++ {
defer fmt.Print(" ", i+1)
}
fmt.Println("Count down start !")
}
こちらの実行結果は,
Count down start !
10 9 8 7 6 5 4 3 2 1
このようにります!
deferに指定した関数はスタックされます!
スタックとは
スタックとは,LIFO(Last In First Out)とも呼ばれます.詳しくはこちらを参照してください.
上のサムネイル画像で簡単に説明すると,一つの「箱」に「値」をいれます(push).このとき,値は積みあがっていきます.(stack=積み重ねの意味)
ここで,「値」を「箱」から取り出す(pop)場合,「箱」の一番上から順に「値」が取り出されます.
これが,スタックです.
スタックを勉強するついでに「キュー(FIFO)」も勉強しましょう!
FIFOは「First In First Out」の略です.(ワールドカップではありませんw)
このようなアルゴリズムやアーキテクチャを学ぶことは,
良いソフトウェア開発者になるための必須条件です!
Deferのメリット
サポートお願いいたします.主に初心者から中級向けに,ソフトウェア開発に関する知識を提供していきます.