Go

[Go言語] deferに関する実験

More than 5 years have passed since last update.


実験1:最後に書いたものが

最後に書いたものが最初に呼ばれるよ。

http://play.golang.org/p/gb8tbGk4wr

package main

import "fmt"

func f() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
}

func main() {
f()
}


実験2:引数の評価は

引数の評価は、deferで関数の呼び出しが予約される時に行なわれるよ。

http://play.golang.org/p/-MPMro0vUy

package main

import "fmt"

func f() {
i := 0
defer fmt.Printf("i is %d", i)
i = 100
}

func main() {
f()
}

http://play.golang.org/p/FXKl3S4mi0

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呼び出しはいける

http://play.golang.org/p/ewH2vlyWsL

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()
}