defer的坑与return的理解

defer会常常用到,可是这个坑对于我并不会踩到,由于我一般不会用到命名返回参数,一则没有多少必要,二则增长了代码阅读难度。不过,这个坑能让人很好地理解return这个关键字,因此在此记录下。函数

func test() (res int) {
    res = 1
    defer func() {
        res++
    }()
    return 0
}

默默在内心运行这个程序,第一个返回值应该是0嘛,其实否则,return并非个原子操做。分为了,赋值和返回两个操做,<return 0>实际上是等价于<res = 0, return res>,而defer是在赋值操做后执行的,因此这个函数等价于:code

func test() (res int) {
    res = 1    
    res = 0    //赋值
    func() {
        res++    //defer
    }()
    return res //返回
}

再来看个例子:test

func test() (res int) {
    tmp := 1
    defer func() {
        tmp++
    }()
    return tmp
}

按刚才的经验分析下这个程序,tmp=1,而后返回前又加了1,应该是2吧。其实又错了,注意返回值命名是res,而不是tmp,defer改变的只能是tmp。这个函数能够等价于:程序

func test() (res int) {
    tmp := 1
    res = tmp
    func() {
        tmp++
    }()
    return 
}

结果应该是1。经验

相关文章
相关标签/搜索