gorogoroyasu

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

メモ 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 文が呼ばれた段階で行われていることを示唆している。
たぶん。