package mainimport (    "errors"    "fmt"    "runtime")func main() {    var err error    err = nil    var i int64    i = 0    defer dead(err, i)    defer dead2(&err, &i)    defer func() {        // 闭包,err,i的值会随着调用函数的语句扭转        _, _, line, _ := runtime.Caller(0)        fmt.Printf("%v err:%v  i:%v\n", line, err, i)    }()    defer func(err error, i int64) {    // 尽管是闭包,然而 defer内函数的值拷贝        _, _, line, _ := runtime.Caller(0)        fmt.Printf("%v err:%v  i:%v\n", line, err, i)    }(err, i)    i = 5    err = errors.New("aaa")    _, _, line, _ := runtime.Caller(0)    fmt.Printf("%v err:%v  i:%v\n", line, err, i)}func dead(err error, i int64) {// 值传递,defer申明的时候,error,i值曾经确定了    _, _, line, _ := runtime.Caller(0)    fmt.Printf("%v err:%v  i:%v\n", line, err, i)}func dead2(err *error, i *int64) {// 指针传递,err i 指向的内容,会反映出defer执行时的内容。    _, _, line, _ := runtime.Caller(0)    fmt.Printf("%v err:%v  i:%v\n", line, *err, *i)}