defer 语句定义时,对外部变量引用两种方式:函数参数,闭包引用
对于函数参数,在 defer 定义时,就把值传给 defer 并 cache 起来,真正执行时,用到的就是这个 cache 值。
对于闭包引用,defer 真正执行时才确定值。
package mainimport "fmt"type number intfunc (n number) print() { fmt.Println(n) }func (n *number) pprint() { fmt.Println(*n) }func main() {var n numberdefer n.print() // 函数参数 0,定义时参数已经复制了defer n.pprint() // 3defer func() { n.print() }() // 闭包引用 3defer func() { n.pprint() }() // 3defer func(a number) { a.print() }(n) // 函数参数 0,定义时参数已经复制了defer func(a *number) { a.pprint() }(&n) // 3n = 3}
