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

  • 相关阅读:
    day06.2-软链接与硬链接
    day06.1-磁盘管理
    day05.3-Linux进程管理
    day05.2-Vim编辑器
    day05.1-文件归档与压缩
    day04-Linux系统中用户控制及文件权限管理方法
    day03-Linux操作系统目录结构
    day02.2-常用Linux命令整理
    BST_traverse(中序遍历,前序遍历,后序遍历)
    JS_DOM_practice with Pokemon
  • 原文地址:https://www.cnblogs.com/9527s/p/13741178.html
Copyright © 2011-2022 走看看