![見出し画像](https://assets.st-note.com/production/uploads/images/65300008/rectangle_large_type_2_e9790f1619dc755e44031cae584ef7e6.png?width=800)
[Go言語 入門] 遅延実行 defer
golangで作ってみたいものがあり、golangを学び始めたので学習したことを書いていくノート。
---------------------------------------------------
サイトマップはこちら
---------------------------------------------------
第11回 遅延実行 defer
deferの基本的な形は以下
「defer 処理」
deferとは遅延実行のことで、deferで宣言した処理は、関数内のすべての処理が完了したタイミングで実行される。
以下は例
// main.go
func foo() {
defer fmt.Println("orange")
fmt.Println("lemon")
}
func main() {
defer fmt.Println("apple")
foo()
fmt.Println("banana")
}
// 実行結果
// lemon
// orange
// banana
// apple
まず始めに実行されるのは「defer fmt.Println("apple")」の部分。
ここは defer で宣言されているため、main関数が終了するタイミングで実行される。
次に「foo()」を実行。foo関数内を確認していく。
「defer fmt.Println("orange")」が宣言されている。これも defer で宣言されているため foo関数が終了するタイミングで実行する。
よって、始めに出力される文字列は「lemon」となり、「lemon」を出力後foo関数が終了するので「orange」が出力される。
main関数に戻り、「banana」を出力。そして最後に「apple」が出力されるといった流れ。
では、defer が同じ関数内に複数あった場合はどのようになるのか。
// main2.go
func main() {
defer fmt.Println("apple")
defer fmt.Println("banana")
defer fmt.Println("orange")
defer fmt.Println("lemon")
}
// 実行結果
// lemon
// orange
// banana
// apple
上記の結果より、golang の defer は先入れ後出しのスタック実装となっている。
スタック実装のいい実例が思い浮かばなかったので、パフェで例える。
作り手は、カップの底から
「apple」➞ 「banana」➞「orange」➞「lemon」
と上に向かって作るのに対し、食べるときは
「lemon」➞ 「orange」➞「banana」➞「apple」
の順で上から食べていく。これが先入れ後出し法!(いい例えかは不明…)
ファイル操作をするときなどに使われることが多いそう。
以上
この記事が気に入ったらサポートをしてみませんか?