在函数中,程序员经常需要创建资源(比如:
数据库连接,文件句柄,锁等
),为了在函数执行完结后,及时的释放资源,Go提供了defer(延时机制)
//当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈)
//当函数执行完结后,再从defer栈,按照先入后出的方式出栈,执行
func sum(n1 int, n2 int) int {
defer fmt.Println("ok1 n1=", n1) //3.ok1 n1=10
defer fmt.Println("ok2 n2=", n2) //2.ok2 n2=20
res := n1 + n2
fmt.Println("ok3 res=", res) // 1.ok3 res =30
return res
}
func main() {
res := sum(10, 30)
fmt.Println("ok4 res=", res) //4.ok4 res=30
}
细节说明
1、当执行到defer
时,暂时不执行,会将defer
后面的语句压入到独立的栈(defer栈)
2、当函数执行完结后,再从defer栈
,按照先入后出
的方式出栈,执行
3、在defer
将语句压入栈
时,也会有相关的值拷贝到栈
package main
import (
"fmt"
)
//当执行到defer时,暂时不执行,会将defer后面的语句压入到独立的栈(defer栈)
//当函数执行完结后,再从defer栈,按照先入后出的方式出栈,执行
func sum(n1 int, n2 int) int {
defer fmt.Println("ok1 n1=", n1) //3.ok1 n1=10
defer fmt.Println("ok2 n2=", n2) //2.ok2 n2=20
n1++ //n1=11
n2++ //n2=21
res := n1 + n2
fmt.Println("ok3 res=", res) // 1.ok3 res =32
return res
}
func main() {
res := sum(10, 30)
fmt.Println("ok4 res=", res) //4.ok4 res=32
}
-
defer
最主要的价值是:在函数执行完之后释放函数创建的资源
网友评论