GO语言延迟函数defer用法详解
作者:yasinawolaopo 发布时间:2024-02-18 16:56:27
标签:GO,defer,延迟函数
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)
}
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
}
结果
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


猜你喜欢
- 文本框 textarea 限制输入文字个数的的javascript代码,我们经常在评论留言页面我们需要在客户端限制访客的留言长度,当然最好我
- 本文实例为大家分享了Python九宫格图片生成的具体代码,供大家参考,具体内容如下利用Image类将一张图片分割成9张,发朋友圈利器,打包成
- 1、php支持哪些数据库(拥有哪些数据库接口)Adabas D ,InterBase ,PostgreSQL ,dBase ,FrontBa
- 数字字符串前后有空格没事:>>> print(int(" 3 "))3但是下面这种带小数点的情况是不可
- 要用django的orm表达sql的exists子查询,是个比较麻烦的事情,需要做两部来完成from django.db.models im
- 我设了个排卖的起始时间然后设了一个结束时间现在要精确到小时比如提示 “离到期时间:1天XX小时”大家有什么想法吗?我就是在小时总是不能实现,
- 设置MySQL数据同步(单向&双向)由于公司的业务需求,需要网通和电信的数据同步,就做了个MySQL的双向同步,记下过程,以后用得到
- 简单的说,GUI编程就是给程序加上图形化界面.python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台
- <%@ Page Language="C#" %><!DOCTYPE html PUBLIC &quo
- 在使用django-rest-framework开发项目的时候我们总是避免不了跨域的问题,因为现在大多数的项目都是前后端分离,前后端项目部署
- 如下所示:df = pd.DataFrame({'key': ['b', 'b', '
- 今天项目中遇到了中文编码的zip文件,处理了蛮长时间,所以记录下,以免下次踩坑。Python2下Python2中读取zip文件,zipfil
- 生命游戏的算法就不多解释了,百度一下介绍随处可见。因为网上大多数版本都是基于pygame,matlab等外部库实现的,二维数组大多是用num
- Linux安装MySQL笔记1、在安装MySQL数据库服务器前,确保你的linux系统是可以连接网络的,下面我们将通过源码方式来安装mysq
- 本文实例讲述了php中正则替换函数ereg_replace用法。分享给大家供大家参考。具体如下:下面的实例是利用php 正则替换函数 ere
- unsigned 既为非负数,用此类型可以增加数据长度! 例如如果 tinyint最大是127,那 tinyint unsigned 最大
- 为什页面刷新会出现404因为vue项目中路由hash模式改为了history模式,由于hash模式时url带的#号后面是哈希值不会作为url
- 需求给定一个日期,格式如 “2020-2-12”,计算出这个日期是 2020 年的第几天?实现思路使用 tkinter 和 tkinter.
- 遇到的问题网上找了一些代码,都是只能建立一次socket传输一张图片,然后断开重新连重新传。而建立一次socket代价不小,反复建立会非常消
- 研究编码,得知GB2312编码与区位码的关系,尝试之后,得此程序。搜索,似乎没人写,故发此地。1.简述(1)GB2312标准的定义,其实就是