zoukankan      html  css  js  c++  java
  • golang defer和return

    这些细节实际项目中未必会用到,可能可读性较差

    defer函数用到变量时,变量已经定义,这个分两种情况,是否闭包,

    闭包使用引用,最后到defer执行时,可能变量已经被改变。

    return发生分为两步,第一步给返回值赋值,例如

    return res   先给res赋值,再执行defer函数,最后返回。

    以下分三种情况

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

     此情况下,return时res赋值为0,执行defer函数 res++,res为2,最后返回值为2

    第二种情况

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

     return之前,res = tmp,此时res为1,tmp++,tmp值为2,最后返回1

    例三

    func f2() *int {
        res := 1
        defer func(){res++}()
    
        return &res
    
    }
    

      return &res”把i的地址赋值给返回值,同样是临时变量‘tmp *int’。即,真正返回的是i的地址*tmp。然后,执行defer的时候,对tmp指针没操作,但是tmp指向的那个值(即i),修改成了2。所以,如果对返回的指针取值,结果是2。和传址参数一样理解

    12.30更新

    func watShadowDefer(i int) (ret int) {
        ret = i * 2
        if ret > 10 {
            ret := 10
            defer func() {
                ret = ret + 1
            }()
        }
        return
    }
    
    func main() {
        result := watShadowDefer(50)
        fmt.Println(result)
    }

    因为变量作用域,内部ret和外部ret不是一个变量,defer改变的内部ret,返回不变,结果为100

  • 相关阅读:
    java课后作业-4
    课堂练习
    16年9月27日上午
    《大道至简》第二章读后感
    《大道至简》-编程的精义读后感
    用Windbg来看看CLR的JIT是什么时候发生的
    如何调试什么时候SaveFileDialog会被Dispose
    针对C#程序做性能测试的一些基本准则
    要注意null合并运算符的优先级比+还要低
    实现GetHashCode时要遵循的规则
  • 原文地址:https://www.cnblogs.com/9527s/p/13741178.html
Copyright © 2011-2022 走看看