我正在阅读go规范,但没有完全理解示例延迟的行为。
// f returns 1
func f() (result int) {
defer func() {
result++
}()
return 0
}
该函数具有命名的返回值,匿名延迟函数将对其递增。该函数以“返回0”结束。此值不返回,而是递增的变量。
在试图理解这种行为时,我遇到了更多问题。如果我给返回变量赋值,那似乎对返回值没有影响。
//b returns 1
func b() (result int) {
result = 10
defer func() {
result++
}()
return 0
}
但是,如果最后一行更改为:
return result
事情的表现符合我的预期。
https://play.golang.org/p/732GZ-cHPqU
有人可以帮助我更好地理解为什么返回这些值以及这些函数的范围。
如果延迟函数是函数文字,并且周围函数的命名结果参数在文字范围内,则延迟函数可以在返回结果参数之前对其进行访问和修改。
并且关于return语句:
指定结果的“ return”语句在执行任何延迟函数之前会设置结果参数。
范例1:
func f() (result int) {
defer func() {
result++
}()
return 0
}
的result
变量被初始化为零; return语句设置result
为零;延迟函数result
增加到1;该函数返回1。
范例2:
func b() (result int) {
result = 10
defer func() {
result++
}()
return 0
}
result
在函数的第一条语句中将该变量设置为10;return语句设置result
为零;延迟函数result
增加到1;该函数返回1。
范例3:
func c() (result int) {
result = 10
defer func() {
result++
}()
return result
}
result
在函数的第一条语句中将该变量设置为10;return语句设置result
为10;延迟的函数result
增加到11,该函数返回11。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句