見出し画像

[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」

の順で上から食べていく。これが先入れ後出し法!(いい例えかは不明…)

ファイル操作をするときなどに使われることが多いそう。

以上


この記事が気に入ったらサポートをしてみませんか?