GO语言延迟函数defer怎么使用


今天主机评测网小编给大家分享一下GO语言延迟函数defer怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

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

入门案例

packagemainimport"fmt"funcsum(n1int,n2int)int{//当执行到defer时,会将defer后面的语句压入到独立的栈中(我们取名为defer栈吧)//当函数执行完毕后,再从defer栈,先进后出的方式出栈然后执行deferfmt.Println("ok1n1=",n1)//3.n1deferfmt.Println("ok2n2=",n2)//2.n2res:=n1+n2//res=30,首先执行fmt.Println("ok3res=",res)//1.res=n1+n2returnres}funcmain(){res:=sum(10,20)fmt.Println("mainres=",res)}

main方法调用sum函数

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

注意事项

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

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

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

packagemainimport"fmt"funcsum(n1int,n2int)int{//当执行到defer时,会将defer后面的语句压入到独立的栈中(我们取名为defer栈吧)//当函数执行完毕后,再从defer栈,先进后出的方式出栈然后执行deferfmt.Println("ok1n1=",n1)//n1=10deferfmt.Println("ok2n2=",n2)//n2=20n1++//添加代码:n1++n2++//添加代码:n2++res:=n1+n2fmt.Println("ok3res=",res)//res=32returnres}funcmain(){res:=sum(10,20)fmt.Println("mainres=",res)//结果还是会被影响res=32}

结果

defer最佳实践

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

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

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

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

以上就是“GO语言延迟函数defer怎么使用”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注主机评测网行业资讯频道。


上一篇:安装的mysql中没有my.ini文件如何解决

下一篇:怎么用uni-app和uView实现多图上传功能


Copyright © 2002-2019 测速网 https://www.inhv.cn/ 皖ICP备2023010105号 城市 地区 街道
温馨提示:部分文章图片数据来源与网络,仅供参考!版权归原作者所有,如有侵权请联系删除!
热门搜索