闲话不多说,先上3个小例子
func f() (result int) {
defer func() {
result++
}()
return 2
}
//
func f2() (r int) {
t := 2
defer func() {
t = t + 1
}()
return t
}
func f3() (r int) {
defer func(r int) {
r = r + 1
}(r)
return 2
}
如果进行赋值,f1(), f2(), f3()分别返回3,2,2
如果要正确理解,首先要记住defer两点重要特征:
- defer在return xxx赋值之后,return空之前执行
- defer如果有传参,传参定义必须在defer之前,否在参数默认为0穿进去
以上f1()比较容易理解, 因为return 2 先进行result=2 再进入defer函数,result++变成了3,最后return, 所以最终结果为3
而f2() return t 其实就是r=t, 进入defer,改变了t的值,没有改变r的值,所以最终返回结果为2
f3() return 2 其实是r=2, 进入defer 这个时候,r=2是执行时的结果,而编译时r没有在前面进行任何赋值,所以传入defer参数r默认为0, defer中传参为0, 内部同名变量r初始为0,改变后为1;但内部同名变量r并不是外部f3()的返回变量r,仅仅只是同名而已