共计 700 个字符,预计需要花费 2 分钟才能阅读完成。
package main
import (
"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)
}
正文完