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

user40176:

我正在阅读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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章