延迟调用defer
关键字 defer
用于延迟一个函数或者方法(或者当前所创建的匿名函数)的执行。注意,defer语句只能出现在函数或方法的内部。
defer 语句经常被用于处理成对的操作,如打开、关闭、连接、断开连接、加锁、释放锁。通过defer 机制,不论函数逻辑多复杂,都能保证在任何执行路径下,资源被释放。释放资源的 defer应该直接跟在请求资源的语句后。
多个defer的执行顺序
如果一个函数中有多个 defer 语句,它们会以LIFO(后进先出)的顺序执行。哪怕函数或某个延迟调用发生错误,这些调用依旧会被执行。
- 正常情况下,程序崩溃,下面的程序将不会被执行。
defer和匿名函数结合使用
注意,defer已经进行了传参,只是没有调用。
defer func(a, b int) {
fmt.Printf("a=%d,b=%d\n", a, b)
}(a, b)
相当于,提前已经把a,b的值传入,只有等到mian函数结束前才进行调用。
defer func(a, b int) {
fmt.Printf("a=%d,b=%d\n", a, b)
}(10,20)
获取命令行参数
接收用户传递的参数,都是以字符串方式传递。
局部变量
- 定义在
{}
里画的变量就是局部变量,只能在{}
里面有效。
- 执行到定义变量那句话,才开始分配空间,离开作用域自动释放。
全局变量
定义在函数外部的变量是全局变量,在任何地方都可以使用。
- 不同作用域,允许定义同名变量,使用变量的原则为就近原则。