我正在阅读go specification,但没有完全理解延迟示例的行为。
// 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
有人可以帮助我更好地理解为什么返回这些值以及这些函数的范围。
答案 0 :(得分:1)
specification says this about deferred functions:
如果延迟函数是函数文字,并且周围函数的命名结果参数在文字范围内,则延迟函数可以在返回结果参数之前对其进行访问和修改。
和and this about return statements:
用于指定结果的“返回”语句在执行任何延迟函数之前会设置结果参数。
示例1:
var path = '@Url.Action("DownloadBulkLoadActionTemplate", "Upload", new { templateType = "xxxx" })';
path = path.replace("xxxx", selectedTempleteType);
func f() (result int) {
defer func() {
result++
}()
return 0
}
变量被初始化为零; return语句将result
设置为零;延迟函数将result
递增为1;该函数返回1。
示例2:
result
在函数的第一条语句中将func b() (result int) {
result = 10
defer func() {
result++
}()
return 0
}
变量设置为10; return语句将result
设置为零;延迟函数将result
递增为1;该函数返回1。
示例3:
result
在函数的第一条语句中将func c() (result int) {
result = 10
defer func() {
result++
}()
return result
}
变量设置为10; return语句将result
设置为10;延迟的函数将result
递增到11,该函数返回11。