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
}