首页> 基础笔记 >GoLang基础学习 >函数 函数

Golang函数的defer延时操作介绍和注意事项

作者:小萝卜 2023-04-06 浏览 210

简介在函数中,程序员经常需要创建资源 (比如:数据库连接、文件句柄、锁等 ),为了在函数执行完毕后,及时的释放资源,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)

文章评论

    高端网站建设