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 2
}
以上代码将打印:4 1 3
。谁能解释一下?当然,DeferFunc1
应该返回4
。但是,为什么DeferFunc2
和DeferFunc3
分别返回1
和3
?是关于Go中的闭包还是变量作用域?
答案 0 :(得分:5)
如果DeferFunc1
对您有意义,那么DeferFunc3
应该以及它们都说明了相同的概念,即您可以修改命名的返回值。
在DeferFunc1
中,您将3加1延后得出预期的4。
在DeferFunc3
中,您将延期收益加1到2,得到3。在这里裸返回或返回t将使您达到4。但是在这种情况下,t
被赋值为2就在您的延期执行之前,所以您得到3。
在DeferFunc2
中,您没有使用命名返回,因此您无法利用此技术。