go语言defer语句

一、基本介绍

延时机制,在函数中,程序员经常需要创建资源(比如:数据库连接、文件句柄、锁等),为了在函数执行完毕后,及时释放资源,Go的设计者提供defer

二、案例说明

package main

import (
	"fmt"
)

func sum(a, b int) int {

	defer fmt.Println("ok1 a=", a)
	defer fmt.Println("ok2 b=", b)
	result := a + b
	fmt.Println("ok3 result=", result)
	return result
}
func main() {
	sum := sum(10, 20)
	fmt.Println("ok4 sum=", sum)
}

输出结果

ok3 result= 30
ok2 b= 20
ok1 a= 10
ok4 sum= 30

代码说明:

  1. 当执行defer时,暂时不执行,会将defer后面的语句压入到独立的栈(后面对这个独立的栈称为defer栈)
  2. 当函数执行完毕后,再从defer栈,按照先入后出的方式出栈,执行

三、注意细节

  1. 当go执行到一个defer时,不会立即执行defer后面的语句,而是将defer后的语句压入到一个栈中,然后继续执行函数下一个语句
  2. 当函数执行完毕后,在从defer栈中,一次从栈顶取出语句执行,(注:遵守先入后出的机制)
  3. 在defer将语句压入到栈时,也会将相关的值拷贝同时入栈。
package main

import (
	"fmt"
)

func sum(a, b int) int {
	defer fmt.Println("ok1 a=", a)
	defer fmt.Println("ok2 b=", b)
	a++
	b++
	result := a + b
	fmt.Println("ok3 result=", result)
	return result
}
func main() {
	sum := sum(10, 20)
	fmt.Println("ok4 sum=", sum)
}

输出结果:

ok3 result= 32
ok2 b= 20
ok1 a= 10
ok4 sum= 32

四、编程应用

  1. 在golang编程中的通常做法是,创建资源后(比如:打开了文件,获取了数据库链接,或者是锁资源,可以执行defer file.Close()、defer connect.Close()、
  2. 在defer后,可以继续使用资源
  3. 当函数执行完毕后,系统会依次从defer栈中,取出语句,关闭资源
  4. 这种机制,非常简洁,程序员不用再为什么时候关闭资源而烦心
posted @ 2021-05-12 21:21  若雨蚂蚱  阅读(94)  评论(0编辑  收藏  举报