首页> 基础笔记 >GoLang基础学习 >函数 函数
Golang函数的defer延时操作介绍和注意事项
作者:小萝卜 2023-04-06 【 GoLang 】 浏览 551
简介在函数中,程序员经常需要创建资源 (比如:数据库连接、文件句柄、锁等 ),为了在函数执行完毕后,及时的释放资源,Go的设计者提供 defer (延时机制)。
为什么需要defer
在函数中,程序员经常需要创建资源 (比如:数据库连接、文件句柄、锁等 ),为了在函数执行完毕后,及时的释放资源,Go的设计者提供 defer (延时机制)。
快速入门案例
package main
import "fmt"
func sum(n1 int, n2 int) int {
//当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈)
//当函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行
defer fmt.Println("n1=", n1) //第三执行
defer fmt.Println("n2=", n2) //第二执行
res := n1 + n2
fmt.Println("res = ", res) //第一执行
return res
}
func main() {
res := sum(10, 20)
fmt.Println("res=", res) //第四执行
}
执行后,输出的结果:
res = 30
n2= 20
n1= 10
res= 30
defer的注意事项和细节
1)当 go执行到一个 defer时,不会立即执行 defer后的语句,而是将 defer后的语句压入到一个栈中,然后继续执行函数下一个语句。
2)当函数执行完毕后,在从 defer栈中,依次从栈顶取出语句执行(注:遵守栈先入后出的机制),
3)在 defer将语句放入到栈时,也会将相关的值拷贝同时入栈。如下面代码:
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
//增加一句话
n1++ // n1 = 11
n2++ // n2 = 21
res := n1 + n2 // res = 32
fmt.Println("ok3 res=", res) // 1. ok3 res= 32
return res
}
func main() {
res := sum(10, 20)
fmt.Println("res=", res) // 4. res= 32
}
输出结果:
ok3 res= 32
ok2 n2= 20
ok1 n1= 10
res= 32
defer的最佳实践
defer最主要的价值是在,当函数执行完毕后,可以及时的释放函数创建的资源。看下模拟代码。。
说明
1)在 golang编程中的通常做法是,创建资源后,比如(打开了文件,获取了数据库的链接,或者是锁资源),可以执行 defer file.Close() defer connect.Close()
2)在 defer后,可以继续使用创建资源.
3)当函数完毕后,系统会依次从 defer栈中,取出语句,关闭资源.
4)这种机制,非常简洁,程序员不用再为在什么时机关闭资源而烦心。
很赞哦! (0)
上一篇:Golang函数参数传递方式
下一篇:Golang闭包的最佳实践