GO语言延迟函数defer用法详解

作者:yasinawolaopo 时间:2024-02-18 16:56:27 

go语言中defer最主要的目的是在函数执行完毕后及时的释放资源

入门案例

package main

import "fmt"

func sum(n1 int, n2 int) int {
//当执行到defer时,会将defer后面的语句压入到独立的栈中(我们取名为defer栈吧)
//当函数执行完毕后,再从defer栈,先进后出的方式出栈然后执行
defer fmt.Println("ok1 n1=",n1) // 3. n1
defer fmt.Println("ok2 n2=",n2) //2. n2
res := n1 + n2 //res = 30,首先执行
fmt.Println("ok3 res=",res) // 1. res = n1 + n2
return res
}

func main(){
res := sum(10,20)
fmt.Println("main res=",res)
}

GO语言延迟函数defer用法详解

main方法调用sum函数

代码执行到第一个defer后,编译器(系统)会将第一个defer这段压入到defer的栈中(暂时不执行)

注意事项

  • 当ggo执行到一个defer时,不会立刻执行defer后的语句,而是将defer后的语句压入一个独立的栈中,然后继续执行函数下一条语句

  • 当执行完毕后,再从defer栈(只是为了理解这么叫,实际其实只是一个独立的栈),依次从栈顶取出语句执行(先进后出原则)

  • defer将语句放入栈时,也会将相关的值拷贝同时入栈(入栈时是什么值就是什么值)

package main

import "fmt"

func sum(n1 int, n2 int) int {
//当执行到defer时,会将defer后面的语句压入到独立的栈中(我们取名为defer栈吧)
//当函数执行完毕后,再从defer栈,先进后出的方式出栈然后执行
defer fmt.Println("ok1 n1=",n1) //n1 = 10
defer fmt.Println("ok2 n2=",n2) //n2 = 20
n1++ //添加代码: n1++
n2++ //添加代码: n2++
res := n1 + n2
fmt.Println("ok3 res=",res) //res = 32
return res
}

func main(){
res := sum(10,20)
fmt.Println("main res=",res) //结果还是会被影响 res = 32
}

结果

GO语言延迟函数defer用法详解

defer最佳实践

defer主要的价值是在当函数执行完毕后,可以及时释放函数创建的资源

//示意代码
func test(){
//关闭文件资源
file = openfile(文件名)
defer file.close()
//其他代码
//连接的数据库还是可以使用的
}
func test(){
//释放数据库资源
connect = openDatabase()
defer connect.close()
//其他代码
//连接的数据库还是可以使用的
}
  • 在golang编程中的通常的做法是,创建资源后,比如(打开了文件,获取了数据库连接或者时锁等资源)可以执行defer语句来进行关闭(函数执行完后才从独立的栈中释放关闭资源)

  • defer可以继续使用创建的资源

  • 当函数执行完后,系统会依次从这个独立的栈中取出语句或关闭资源

来源:https://blog.csdn.net/yasinawolaopo/article/details/129754891

标签:GO,defer,延迟函数
0
投稿

猜你喜欢

  • SQLServer2019安装教程图文详解

    2024-01-24 10:09:13
  • 使用Python批量修改文件名的代码实例

    2022-03-21 04:02:53
  • python中return不返回值的问题解析

    2021-04-26 20:36:07
  • Docker构建python Flask+ nginx+uwsgi容器

    2023-07-25 06:36:43
  • 双向RNN:bidirectional_dynamic_rnn()函数的使用详解

    2022-07-26 17:42:07
  • python 图片去噪的方法示例

    2021-12-10 19:42:25
  • Python学习笔记之os模块使用总结

    2023-05-12 07:46:21
  • keras的load_model实现加载含有参数的自定义模型

    2021-03-05 08:18:56
  • js父页面中使用子页面的方法

    2024-04-19 09:50:49
  • Python pandas DataFrame数据拼接方法

    2022-11-08 08:09:36
  • Python使用Selenium实现淘宝抢单的流程分析

    2022-01-31 04:04:18
  • python不相等的两个字符串的 if 条件判断为True详解

    2021-12-12 16:54:51
  • Notice: Undefined index: page in E:\\PHP\\test.php on line 14

    2023-10-27 20:04:46
  • 给你一面国旗 教你用python画中国国旗

    2023-06-25 15:10:36
  • Python基础之函数嵌套知识总结

    2021-12-07 18:54:09
  • 显示某日期所在星期的所有日期asp代码

    2008-06-01 16:05:00
  • 纠结于ajax开发中 response的contentType 问题

    2008-12-11 13:46:00
  • vs code开发中语法正确但显示报错问题分析解决

    2023-08-05 11:54:26
  • python selenium UI自动化解决验证码的4种方法

    2022-10-09 20:43:06
  • 有序列表 li ol

    2008-07-30 12:31:00
  • asp之家 网络编程 m.aspxhome.com