defer延时机制
为了在函数执行完毕后,及时释放资源,Go提供了defer延时机制。
案例1:
func Add(n1 int, n2 int) int{
defer fmt.Println("n1 =",n1)
defer fmt.Println("n2 =",n2)
sum := n1+n2
fmt.Println("sum1 =",sum)
return sum
}
func main() {
sum := Add(2,3)
fmt.Println("sum2 =", sum)
}
/*
sum1 = 5
n2 = 3
n1 = 2
sum2 = 5
*/
当go执行到defer时,不会立即执行,会将其压入栈中,当函数执行完毕后,会从栈顶依次执行语句。
案例2:
func Add(n1 int, n2 int) int{
defer fmt.Println("n1 =",n1)
defer fmt.Println("n2 =",n2)
//在defer入栈后变量++
n1++
n2++
sum := n1+n2
fmt.Println("sum1 =",sum)
return sum
}
func main() {
sum := Add(2,3)
fmt.Println("sum2 =", sum)
}
/*
sum1 = 7
n2 = 3
n1 = 2
sum2 = 7
*/
由上可知,defer语句入栈时,会将相关的值一并拷入。
案例3(模拟):
defer主要的价值就是资源的释放。
func test(){
file = openfile("xxx")
defer file.close()
}
func test(){
connect = openDatabse()
defer connect.close()
}
这种机制十分简介,不需要再考虑什么时候释放资源。