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

September 29, 2013

この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。

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