开发者学堂课程【Go 语言核心编程 - 基础语法、数组、切片、Map: defer 的基本使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9609
defer 的基本使用
基本内容
一、 为什么需要 defer
二、 快速入门案例
一、为什么需要 defer
在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等),为了在函数执行完毕后,及时的释放资源,Go 的设计者提供 defer (延时机制)。打开一个数据库的链接,文件句柄、锁都是资源。只要加上 defer,函数在执行完毕后, defer 后面的语句也会执行。
二、快速入门案例
1、 代码示例:
package main
import (
"fmt"
)
func sum(n1 int, n2 int) int {
//当执行到 defer 时,暂时不执行,会将 defer 后面的语句压入到独立的栈( defer栈)
//当函数执行完毕后,再从 defer 栈,按照先入后出的方式出栈,执行
defer fmt.Println( "ok1 n1=", n1) //defer 3. ok1 n1=10
defer fmt.Println( "ok2 n2=", n2) //defer 2.ok2 n2=20
res := n1 + n2 // res = 30
fmt.Print1n( "ok3 res=", res) // 1.ok3 res= 30
return res
}
func main(){
res := sum( 10,20)
fmt.Println( "res=", res) // 4. res=30
}
2、 执行后,输出的结果:
ok3 res=30
ok2 n2=20
ok1 n1=10
res =30
3、 代码解析:
新建一个文件夹 deferdemo,在文件夹中新建一个文件 main.go,import 一个包叫 fmt。主函数调用 sum(10,20)返回一个 int,将 n1+n2 后给 res 变量,输出一个 ok。res 等于这个值,再把 res 返回回来。接收返回来这个值 res : = sum( 10,20)。判断输出的顺序,当执行到 defer 时,会将 defer 后面的语句压入到独立的栈中,暂时不执行,当函数执行完毕后,再从 defer 栈按照先入后出的方式出栈执行,先进去后执行。res=30, 先输出的是 ok3 res=30。再执行 return,return 执行过后,sum 执行完毕了。ok1 n1= 先入栈后出,出栈的时候先把栈顶的弹出来,再执行 ok2,再 ok1,当 defer 栈全部都执行完毕后,最后执行 res=30。defer 在这里的起的作用是可以把一些 sum 函数完毕过后要执行的语句先把它压入到 defer 栈中,等到这个函数执行过后再依次的执行。在资源进行释放的时候,会经常使用到这个。第一执行 ok3,再执行 ok2,再执行 ok1,最后执行 res,输出的结果一致。
