试着猜一下:下面这个例子的运行结果是什么?
package main
import "fmt"
func main() {
fmt.Println(test_function())
}
func test_function() (value int) {
defer func() {
value++
}()
return 0
}
虽然在返回前defer就把value的值修改了,但是defer执行完后执行的是return,所以返回的应该还是0?
让我们看下输出
1
WTF???
为什么会有这样的输出呢?其实真正的执行顺序是:return先把0这个值复制到返回值所在的区域(栈区),然后再执行defer,由于defer后面使用的是闭包修改了变量值,所以最后函数带着返回值1返回。