去延迟函数返回值

时间:2019-08-12 16:54:34

标签: go

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。但是,为什么DeferFunc2DeferFunc3分别返回13?是关于Go中的闭包还是变量作用域?

1 个答案:

答案 0 :(得分:5)

如果DeferFunc1对您有意义,那么DeferFunc3应该以及它们都说明了相同的概念,即您可以修改命名的返回值。

DeferFunc1中,您将3加1延后得出预期的4。
DeferFunc3中,您将延期收益加1到2,得到3。在这里裸返回或返回t将使您达到4。但是在这种情况下,t被赋值为2就在您的延期执行之前,所以您得到3。
DeferFunc2中,您没有使用命名返回,因此您无法利用此技术。