【go】defer的使用
卸载前面
第一次看go基础语法的时候,用使用到了defer。但是一直不知道它到底是什么,有什么用途。这几天通过查询、学习。算是对defer有了一点浅显的认识。
1.什么是defer
defer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行,通常用于释放资源。
2.defer的特点
defer遵循先进后出的原则,类似于栈的结构。
补充下:为什么要把defer设计成这种机制?
因为后申请的资源和可能对前面申请的资源有依赖。如果先将前面申请的资源释放掉了。对于后面的资源可能会造成影响。所以先释放后申请的资源,再释放前面申请的资源。
3.defer什么时间执行
前面说到,defer只有在当前函数执行完毕后,才会执行。其实不太准确。
go中的return语句并不是原子性操作,一般是分为两步:
- 将返回值赋值给一个变量
- 执行RET指令。
defer就执行在1之后,2之前。
4.defer常见的坑
1.输出是多少?
x := 10defer func(a int) {fmt.Println(a)}(x)x++
答案:
为什么?
因为defer后面的函数在入栈的时候保存的是入栈那一刻的值,而当时x的值是10,所以后期对x修改,并不会影响栈内函数的值。
2.输出多少
x := 10defer func(a *int) {fmt.Println(*a)}(&x)x++
答案:
为什么?
这里defer后面函数入栈的时候存入的执行变量x的指针。所以,后期x值改变的时候,输出结果也会改变。
3.输出多少
func test()(x int) {x = 10defer func() {x++}()return x
}
答案:
为什么?
之前我们说过,return并不是原子性操作,是通过一个变量赋值和ret指令来完成的。
而上述例子中,是具名函数。即返回值带有名字。这样我们在执行defer的时候相当于修改了返回值的值。所以为11
看到这里,博主想到了闭包。和闭包有没有关系呢?
4.输出什么
func test1() int {x := 10defer func() {x++}()// ans = x// -------- defer x = x+1// return xreturn x
}
答案:
为什么?
还是return语句的原因,博主已经在代码中给出提示。可见,非具名函数不会受到相应的影响。
对于defer暂时理解了这些,下次再见。
【go】defer的使用相关推荐
- Go 学习笔记(17)— 函数(03)[defer 定义、defer 特点、defer 释放资源]
1. defer 定义 Go 函数的关键字 defer 可以提供注册多个延迟调用,只能出现在函数内部,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,这些调用遵循 ...
- Go基础编程:延迟调用defer
链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 本篇文章所讲的就是go编程中的延迟调用defer,希望对社区的成员有较多的帮助. 1 defer作用 关键字defer ...
- js的defer属性
js的defer属性说明:<script src="js.js" type="text/javascript defer="defer"/> ...
- golang源码分析:defer流程分析
defer defer是golang中使用的延迟调用的函数,该函数的使用场景就是如果函数执行出错(panic),也能够通过recover方式进行捕捉错误并将出错时的一些资源进行回收,如果在性能有要求的 ...
- Script标签的async和defer
之前有写过HTML页面渲染过程,知道了JavaScript是会阻塞DOM解析的,所以我们会把script标签放到底部防止阻塞HTML解析.其实script还有两个属性,async和defer,也是可以 ...
- prefetch 和preload_前端preload, prefetch,dns-prefetch,defer,async了解一下
preload 通过rel="preload"进行内容预加载 元素的 rel 属性的属性值preload能够让你在你的HTML页面中 元素内部书写一些声明式的资源获取请求,可以指明 ...
- GO语言教程4:defer(延迟语句)详解
文章目录 1.defer语句格式 2.defer执行的时间 3.defer语句的作用 4.defer语句执行的顺序 5.defer与return的value之间的关系 6.用defer进行代码跟踪 7 ...
- script标签的defer属性
defer 属性规定是否对脚本执行进行延迟,直到页面加载为止. 有的 javascript 脚本 document.write 方法来创建当前的文档内容,其他脚本就不一定是了. 如果您的脚本不会改变文 ...
- Go笔记-错误处理和defer
为什么80%的码农都做不了架构师?>>> error error类型的声明可在builtin包中查看: type error interface {Error() string } ...
- Js高设笔记1-2章 defer and async
1,js是由ECMAscript ,dom ,bom组成的专为网页交互而设计的脚本语言.js是脚本语言之一. 2,MIME,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的 ...
最新文章
- POJ-1430 Binary Stirling Numbers 组合数学
- pytorch维度统计
- boost::units模块实现绝对温度和温差的华氏和开尔文之间的转换的测试程序
- BZOJ 1055 [HAOI2008]玩具取名
- [论文阅读] (04) 人工智能真的安全吗?浙大团队外滩大会分享AI对抗样本技术
- sbt構建一個spark工程(scala+spark+sbt)
- local sandbox html里的script tag是如何load到memory里的
- 3DTouch - iOS新特性
- svr预测出来是一条直线_不看错过好几亿!5分钟学会用Python预测美股价格
- stm32实验报告心得体会_嵌入式第9次实验报告
- Bootstrap 警告
- [转载] 如何用 PyQt5 快速构建一个简单的 GUI 应用
- IDEA 快速创建 SpringBoot 项目
- oracle clob 粘贴,使用Oracle SQL Developer将CLOB导出到文本文件
- PAT L1-019. 谁先倒
- 仿链家地图找房_【前端-自如/链家/安居客-地图找房】地图api如何获取浏览器视野范围内的经纬度区间?...
- 三星平板电脑安linux,三星平板电脑怎样刷机_三星平板t805c怎么刷机_三星平板怎么刷机...
- openwrt打印机服务器稳定性,软路由 篇一:openwrt共享打印机【上】【完美解决】HP10系打印异常问题...
- winuser.h(10105,3): error C2059: 语法错误:“(”
- 性能监控——cpu使用率过高,该怎么分析?