メモ golang の defer 2
package main import ( "fmt" ) type Hoge struct { a string } func main() { h := &Hoge{"a"} defer fmt.Println("no func", h.a) defer func () {fmt.Println("with func", h.a)}() h.a = "b" }
出力は、
with func b no func a
以前の記事に書いたが、defer は、後入れ先出しで処理される。
よって、 with func
が先に実行され、
no func
が後で実行される。
1つ目の defer、with func
については、h.a = "b"
の結果が表示され、
2つ目のdefer、 no func
については、 h.a = "a"
の結果が表示されている。
これは、 defer 文が、式の実行を遅らせるだけで、式の評価自体は defer 文が呼ばれた段階で行われていることを示唆している。
たぶん。