zoukankan      html  css  js  c++  java
  • Go_defer

    package main
    
    import "fmt"
    
    func main() { //外围函数
    	/*
    	defer的词义:"延迟","推迟"
    	在go语言中,使用defer关键字来延迟一个函数或者方法的执行。
    
    	1.defer函数或方法:一个函数或方法的执行被延迟了。
    
    	2.defer的用法:
    		A:对象.close(),临时文件的删除。。。
    				文件.open()
    				defer close()
    				读或写
    
    		B:go语言中关于异常的处理,使用panic()和recover()
    			panic函数用于引发恐慌,导致程序中断执行
    			defer一定要在可能引发panic的语句之前定义,否则就不会被加载到栈中
    			recover函数用于恢复程序的执行,recover()语法上要求必须在defer中执行
    
    
    	3.如果多个defer函数:
    		放到一个栈中,先进后出。
    		先延迟的后执行,后延迟的先执行。
    
    	4.defer函数传递参数的时候:defer函数调用时,就已经传递了参数数据了,只是暂时不执行函数中的代码而已。
    
    	5.defer函数注意点:
    		
    		当外围函数中的语句正常执行完毕时,只有其中所有的延迟函数都执行完毕,外围函数才会真正的结束执行。
    		当执行外围函数中的return语句时,只有其中所有的延迟函数都执行完毕后,外围函数才会真正返回。
    		当外围函数中的代码引发运行恐慌时,只有其中所有的延迟函数都执行完毕后,该运行时恐慌才会真正被扩展至调用函数。
    
    	 */
    	//defer fun1("hello") //也被延迟了
    	//fmt.Println("12345")
    	//defer fun1("world") //被延迟了
    	//fmt.Println("王二狗")
    
    	a := 2
    	fmt.Println(a) //2
    	defer fun2(a)
    	a++
    	fmt.Println("main中:", a) //3
    
    	fmt.Println(fun3())
    }
    
    func fun1(s string) {
    	fmt.Println(s)
    }
    
    func fun2(a int) { // a = 2
    	fmt.Println("fun2()函数中打印a:", a) //2,表示已经传递了参数数据了,只是暂时不执行函数中的代码而已
    }
    
    func fun3() int {
    	fmt.Println("fun3()函数的执行。。。")
    	defer fun1("haha")
    	return 0
    }
    
    package main
    
    import "fmt"
    
    //defer面试题
    func calc(index string, a, b int) int {
    	ret := a + b
    	fmt.Println(index, a, b, ret)
    	return ret
    }
    
    func main() {
    	x := 1
    	y := 2
    	//defer的时候参数已经传进去了
    	defer calc("AA", x, calc("A", x, y)) //calc是立即执行的
    	x = 10
    	defer calc("BB", x, calc("B", x, y))
    	y = 20
    }
    /*
    A 1 2 3
    B 10 2 12
    BB 10 12 22
    AA 1 3 4
    */
    
  • 相关阅读:
    Codeforces F. Bits And Pieces(位运算)
    一场comet常规赛的台前幕后
    【NOIP2019模拟2019.9.4】B(期望的线性性)
    「NOI2016」循环之美(小性质+min_25筛)
    【NOI2011】兔农(循环节)
    LOJ #6538. 烷基计数 加强版 加强版(生成函数,burnside引理,多项式牛顿迭代)
    noi2019感想
    7.12模拟T2(套路容斥+多项式求逆)
    CF 848E(动态规划+分治NTT)
    CF 398 E(动态规划)
  • 原文地址:https://www.cnblogs.com/yzg-14/p/12247497.html
Copyright © 2011-2022 走看看