package main
func main() {
println(DeferFunc1(1))
println(DeferFunc2(1))
println(DeferFunc3(1))
}
func DeferFunc1(i int) (t int) {
t = i
defer func() {
t += 3
}()
return t
}
func DeferFunc2(i int) int {
t := i
defer func() {
t += 3
}()
return t
}
func DeferFunc3(i int) (t int) {
defer func() {
t += i
}()
return
}
为什么 DeferFunc2 返回值是 1,特别不理解,我分析是4,和DeferFunc1 返回值一样啊,请大神指导一下呗
return操作不是原子操作
匿名和命名返回值在return时执行的流程是不同的
http://404-notfound.cn/golang-return-defer/
#2
更多评论
函数的返回过程是这样的:先个返回值赋值,然后调用defer表达式,最后才是返回到调用函数中.
而DeferFunc2中先给返回值赋值为t,这只是一次深拷贝而已,而后调用defer函数修改t的值,好像跟返回值无关。
而DeferFunc1中的返回值就是t这个变量,所以defer函数修改t的值,肯定就会对返回值有影响。
#1