gorogoroyasu

福岡の開発会社で働いている。

メモ golang のdefer

defer は便利でよく使うので、特性をちゃんと把握しておく必要がある。

  1. defer の実行順
package main

import (
    "fmt"
)

func main() {
    for i:=0; i<3; i++ {
    fmt.Println("1")
    defer fmt.Println(fmt.Sprintf("2-%d", i))
    fmt.Println("3")
    }
}

結果

1
3
1
3
1
3
2-2
2-1
2-0

ということで、後入先出になってることがわかる。

  1. 他の関数内のdefer はいつ呼ばれるのか?
package main

import (
    "fmt"
)

func de(s string) {
    defer fmt.Println(s)
}

func main() {
    for i:=0; i<3; i++ {
    fmt.Println("1")
    de("2")
    }
}

結果

1
2
1
2
1
2

となった。 関数のスコープを抜ける時に呼ばれるらしい。 なるほど。

この辺は、ドキュメントにも書いてあると思うが、 簡単な実験で挙動を確認できるので、サンプルを書いてみると良いと思う。
続けていこう。