0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Goのdefer実行タイミング

Posted at

慣れている人からすると当たり前なんですが、冷静に考えると間違えそうだったので、備忘録。

deferのタイミング

コード
func foo(str string) {
    fmt.Println(str)
}

func main() {
    str := "でぃふぁー"
    defer foo(str)

    str = str + "ぷりんと"
}

さて、この時表示する結果はなんでしょうか。

  1. でぃふぁー
  2. でぃふぁーぷりんと
  3. ぷりんと
  4. 空文字

正解は

結果
でぃふぁー

ですね。

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を眺めてみるのは面白いと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?