为什么在此延迟语句(无返回)运行时不返回返回值?

时间:2018-10-11 01:23:35

标签: go scope return deferred-execution

我正在阅读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

有人可以帮助我更好地理解为什么返回这些值以及这些函数的范围。

1 个答案:

答案 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。