慣れている人からすると当たり前なんですが、冷静に考えると間違えそうだったので、備忘録。
deferのタイミング
コード
func foo(str string) {
fmt.Println(str)
}
func main() {
str := "でぃふぁー"
defer foo(str)
str = str + "ぷりんと"
}
さて、この時表示する結果はなんでしょうか。
- でぃふぁー
- でぃふぁーぷりんと
- ぷりんと
- 空文字
正解は
結果
でぃふぁー
ですね。
defer関数の引数は実際の呼び出しが行われた時ではなく、deferステートメントが実行されたときに評価されます。
return時はどうなるか
ではreturnがある場合先なのか、後なのかどちらでしょう。
コード
func hoge() string {
str := "でぃふぁー"
defer fuga()
fmt.Println("りたーんまえ!")
return str
}
func fuga() {
fmt.Println("いつかな?")
}
func main() {
fmt.Println(hoge())
}
結果
りたーんまえ!
いつかな?
でぃふぁー
コードの並び順的には「いつかな?」→「りたーんまえ!」→「でぃふぁー」ですが、出力結果は違いますね。
deferで出力する「いつかな?」はreturnより先に実行されているのが確認できました。
おまけ
初心忘るべからずということで↓のXアカウントの方をお勧めします。簡単なコードですが「あれ、そういえば...」って感じで現状の自分の答え合わせとしてPostを眺めてみるのは面白いと思います。