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

  • 42
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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