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中的闭包还是可变范围?
发布于 2019-08-12 17:15:00
如果DeferFunc1对您有意义,那么DeferFunc3应该和它们说明相同的概念一样,即您可以修改一个命名的返回值。
在DeferFunc1中,您要在延迟中添加3到1,从而产生预期的4。
在DeferFunc3中,在延迟产生的3中添加1到2。这里的裸露返回或t的返回将使您得到4。但是在这种情况下,t在延迟运行之前被赋值为2,因此得到3。
在DeferFunc2中,您没有使用命名返回,因此不能利用此技术。
https://stackoverflow.com/questions/57465268
复制相似问题