実験1:最後に書いたものが
最後に書いたものが最初に呼ばれるよ。
package main
import "fmt"
func f() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
}
func main() {
f()
}
実験2:引数の評価は
引数の評価は、defer
で関数の呼び出しが予約される時に行なわれるよ。
package main
import "fmt"
func f() {
i := 0
defer fmt.Printf("i is %d", i)
i = 100
}
func main() {
f()
}
package main
import "fmt"
func f() (ret int) {
defer func(n int) {
fmt.Println(n)
fmt.Println(ret)
}(ret) // retはゼロ値で初期化されている
return 100
}
func main() {
fmt.Println(f())
}
実験3:メソッドオブジェクトでも
メソッドオブジェクトでもdefer
呼び出しはいける
package main
import "fmt"
type Hoge struct {
N int
}
func (h *Hoge) PrintN() {
fmt.Println(h.N)
}
func f() {
h := &Hoge{100}
m := h.PrintN
defer m()
h.N = 200
}
func main() {
f()
}