原因是:defer 函数的参数在定义的时候就以及确定了(形参拷贝),所以后面就算修改了值也不会发生变化
示例二 defer函数确定
package main
import "fmt"
func main...("defer输出:", res)
}()
res += 1000
return res
}
以上输出为:
原因是 defer只确定了一个匿名函数地址,匿名函数进行第二次的调用,在匿名函数确定好的时候...= 2
}()
return i
}
输出:
原因是:
return的调用并非原子性的,分为2个步骤:1 确定返回值,2正式返回
在确定返回值之后,会去执行defer方法,如果defer...,并且形参做了一次值拷贝,成为了一个新值
这个规则对于指针类型也同样适用,相当于拷贝了一份指针,但是指针指向的值确实实实在在变了的
规则二:延迟函数执行按后进先出顺序执行,即先出现的defer最后执行...return i
}
该情况下,defer可以引用到i的变量值,进行一次值拷贝,所以defer操作的是拷贝后的i值,不会发生变化(如果返回变量类型为指针类型,则会发生变化)
本文为仙士可原创文章,转载无需和我联系