golang defer

package main

import (
    "fmt"
)

//defer的最佳实践是,当函数执行完毕后,可以及时的释放函数创建的资源
//在前面先写defer file.close(),先把defer压入栈不执行,先执行后面的代码,在整个test函数执行完毕后再执行这个defer中关闭文件的操作
//程序员可以不用在关注什么时候应当关闭资源了。在函数完成后悔根据defer语句自动关闭资源
//func test() {
//    //关闭文件资源
//    file = os.OpenFile(文件名)
//    defer file.close()
//    //其他代码
//}

func sum(n1 int, n2 int) int {
    //当执行到defer时,会将defer后面的语句压入独立的栈(defer栈)
    //当当前函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行
    //在defer将语句放入栈时,也会将相关的值拷贝同时入栈,后面再有值改变如n1++,不会影响defer中的变量n1的值
    defer fmt.Println("n1=", n1) //3.先入栈,后出.n1=10
    defer fmt.Println("n2", n2)  //2.后入栈,先出.n2=2
    n1++                         //n1 = 11
    n2++                         //n2 = 21
    res := n1 + n2               //res = 32
    fmt.Println("res=", res)     //1. 打印res = 32
    return res
}
func main() {
    res := sum(10, 20)
    fmt.Println("res-1=", res) //4.返回主函数最后执行。接收res-1 = 32
}

 

posted @ 2023-02-07 09:58  潇潇暮鱼鱼  阅读(23)  评论(0)    收藏  举报