【发布时间】:2019-05-02 10:37:28
【问题描述】:
调用 defer 对以两种不同方式声明的变量产生不同的结果
package main
import (
"fmt"
)
func c(i int) int {
defer func() { i++ }()
return i
}
func c1() (i int) {
defer func() { i++ }()
return i
}
func c2() (i int) {
defer func() { i++ }()
return 2
}
func main() {
fmt.Println(c(0)) // Prints 0
fmt.Println(c1()) // Prints 1
fmt.Println(c2()) // Prints 3 Thank you icza
}
【问题讨论】:
-
感谢来自#general@golang slack 的 Johan Brandhorst 提供的参考 golang.org/ref/spec#Defer_statements "也就是说,如果周围函数通过显式返回语句返回,则在设置任何结果参数后执行延迟函数该 return 语句,但在函数返回其调用者之前"
-
golang.org/ref/spec#Defer_statements "如果周围函数通过显式 return 语句返回,则延迟函数在 任何结果参数由该 return 语句设置之后执行,但 在函数返回给它的调用者之前。" ... "如果延迟函数是一个函数字面量,并且周围的函数具有在字面量范围内的命名结果参数,则延迟函数可以在返回结果参数之前访问和修改它们。"