defer 语句定义时,对外部变量引用两种方式:函数参数,闭包引用

    对于函数参数,在 defer 定义时,就把值传给 defer 并 cache 起来,真正执行时,用到的就是这个 cache 值。
    对于闭包引用,defer 真正执行时才确定值。

    1. package main
    2. import "fmt"
    3. type number int
    4. func (n number) print() { fmt.Println(n) }
    5. func (n *number) pprint() { fmt.Println(*n) }
    6. func main() {
    7. var n number
    8. defer n.print() // 函数参数 0,定义时参数已经复制了
    9. defer n.pprint() // 3
    10. defer func() { n.print() }() // 闭包引用 3
    11. defer func() { n.pprint() }() // 3
    12. defer func(a number) { a.print() }(n) // 函数参数 0,定义时参数已经复制了
    13. defer func(a *number) { a.pprint() }(&n) // 3
    14. n = 3
    15. }