zoukankan      html  css  js  c++  java
  • go语言---defer

    go语言---defer

    https://blog.csdn.net/cyk2396/article/details/78885135

    1. defer 是在函数退出前调用,多个defer遵循 先进后出 的原则调用;常用来做资源清理,关闭文件,解锁等操作
    func deferTest() {
    	defer func() {
    		fmt.Println("func1...")
    	}()
     
    	func() {
    		fmt.Println("func2...")
    	}()
     
    	defer func() {
    		fmt.Println("func3...")
    	}()
     
    }
    
    
    1. defer调用所需参数在defer语句被压入栈中时获得(拷贝值),尽管defer语句是在函数返回前真正执行
    func main() {
    	x := 5
    	defer fmt.Println("println=", x)
    	defer func(y int) {
    		fmt.Println("func=", y)
    	}(x)
    	x += 10
    	fmt.Println(x)
    }
    
    
    • 输出结果:
      15
      func= 5
      println= 5
    1. defer函数能够读取外围函数的返回值并进行更改操作
    
    func main() {
    	v := c()
    	fmt.Println(v)
    }
     
    func c() (i int) {
    	defer func() { i++ }()
    	return 1
    }
    
    

    输出结果:
    2
    以上代码c()函数可以解析为:

    1.将defer函数压入栈中

    2.给返回值i赋值为1,即i=1

    3.执行defer函数,修改返回值i

    4.执行空的return,即return;

    1. 看以下demo:
    func main() {
    	v := c()
    	fmt.Println(v)
    }
     
    func c() (i int) {
    	x := 1
    	defer func(x int) { x++ }(x)
    	return x
    }
    
    

    输出结果:
    1

    上面函数c()这段代码可以解析为:

    1.给变量x赋值为1

    2.将defer函数压入栈中,同时拷贝变量x的值给defer函数中的x(注意:这是两个不同的x)

    3.给返回值i赋值为x,即i = 1

    4.执行defer函数,defer函数中的x为2(外围函数中的x值仍然为1)

    5.执行return;

    • 总结:

    1.当执行到defer语句时,会先把它压入栈中,此时以值传递的方式获取defer语句所需要的参数,等它的外围函数返回前,开始按 先进后出 的原则执行defer语句

    2.return xxx;语句并不是一个原子操作,当有defer语句时,return xxx可以解释为: 先给返回值赋值,然后执行defer语句,最后执行空的return。所以defer语句有可能更改返回值。

  • 相关阅读:
    新思路,坚持创新;好想法,坚持执行
    新的一年,新的梦想
    新的一年,新的梦想
    大秦帝国-《治秦九论》
    大秦帝国-《治秦九论》
    大学生应当趁早谋划未来(二)--给表弟的建议
    大学生应当趁早谋划未来(二)--给表弟的建议
    解读OpenRTB(实时竞价)生态系统
    Java实现蓝桥杯VIP 算法训练 阶乘末尾
    Java实现 蓝桥杯VIP 算法训练 sign函数
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/9269459.html
Copyright © 2011-2022 走看看