卸载前面

第一次看go基础语法的时候,用使用到了defer。但是一直不知道它到底是什么,有什么用途。这几天通过查询、学习。算是对defer有了一点浅显的认识。

1.什么是defer

defer是go中一种延迟调用机制,defer后面的函数只有在当前函数执行完毕后才能执行,通常用于释放资源。

2.defer的特点

defer遵循先进后出的原则,类似于栈的结构。

补充下:为什么要把defer设计成这种机制?

因为后申请的资源和可能对前面申请的资源有依赖。如果先将前面申请的资源释放掉了。对于后面的资源可能会造成影响。所以先释放后申请的资源,再释放前面申请的资源。

3.defer什么时间执行

前面说到,defer只有在当前函数执行完毕后,才会执行。其实不太准确。
go中的return语句并不是原子性操作,一般是分为两步:

  1. 将返回值赋值给一个变量
  2. 执行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的使用相关推荐

  1. Go 学习笔记(17)— 函数(03)[defer 定义、defer 特点、defer 释放资源]

    1. defer 定义 Go 函数的关键字 defer 可以提供注册多个延迟调用,只能出现在函数内部,在 defer 归属的函数即将返回时,将延迟处理的语句按 defer 的逆序进行执行,这些调用遵循 ...

  2. Go基础编程:延迟调用defer

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 本篇文章所讲的就是go编程中的延迟调用defer,希望对社区的成员有较多的帮助. 1 defer作用 关键字defer ...

  3. js的defer属性

    js的defer属性说明:<script src="js.js" type="text/javascript defer="defer"/> ...

  4. golang源码分析:defer流程分析

    defer defer是golang中使用的延迟调用的函数,该函数的使用场景就是如果函数执行出错(panic),也能够通过recover方式进行捕捉错误并将出错时的一些资源进行回收,如果在性能有要求的 ...

  5. Script标签的async和defer

    之前有写过HTML页面渲染过程,知道了JavaScript是会阻塞DOM解析的,所以我们会把script标签放到底部防止阻塞HTML解析.其实script还有两个属性,async和defer,也是可以 ...

  6. prefetch 和preload_前端preload, prefetch,dns-prefetch,defer,async了解一下

    preload 通过rel="preload"进行内容预加载 元素的 rel 属性的属性值preload能够让你在你的HTML页面中 元素内部书写一些声明式的资源获取请求,可以指明 ...

  7. GO语言教程4:defer(延迟语句)详解

    文章目录 1.defer语句格式 2.defer执行的时间 3.defer语句的作用 4.defer语句执行的顺序 5.defer与return的value之间的关系 6.用defer进行代码跟踪 7 ...

  8. script标签的defer属性

    defer 属性规定是否对脚本执行进行延迟,直到页面加载为止. 有的 javascript 脚本 document.write 方法来创建当前的文档内容,其他脚本就不一定是了. 如果您的脚本不会改变文 ...

  9. Go笔记-错误处理和defer

    为什么80%的码农都做不了架构师?>>> error error类型的声明可在builtin包中查看: type error interface {Error() string } ...

  10. Js高设笔记1-2章 defer and async

    1,js是由ECMAscript ,dom ,bom组成的专为网页交互而设计的脚本语言.js是脚本语言之一. 2,MIME,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的 ...

最新文章

  1. POJ-1430 Binary Stirling Numbers 组合数学
  2. pytorch维度统计
  3. boost::units模块实现绝对温度和温差的华氏和开尔文之间的转换的测试程序
  4. BZOJ 1055 [HAOI2008]玩具取名
  5. [论文阅读] (04) 人工智能真的安全吗?浙大团队外滩大会分享AI对抗样本技术
  6. sbt構建一個spark工程(scala+spark+sbt)
  7. local sandbox html里的script tag是如何load到memory里的
  8. 3DTouch - iOS新特性
  9. svr预测出来是一条直线_不看错过好几亿!5分钟学会用Python预测美股价格
  10. stm32实验报告心得体会_嵌入式第9次实验报告
  11. Bootstrap 警告
  12. [转载] 如何用 PyQt5 快速构建一个简单的 GUI 应用
  13. IDEA 快速创建 SpringBoot 项目
  14. oracle clob 粘贴,使用Oracle SQL Developer将CLOB导出到文本文件
  15. PAT L1-019. 谁先倒
  16. 仿链家地图找房_【前端-自如/链家/安居客-地图找房】地图api如何获取浏览器视野范围内的经纬度区间?...
  17. 三星平板电脑安linux,三星平板电脑怎样刷机_三星平板t805c怎么刷机_三星平板怎么刷机...
  18. openwrt打印机服务器稳定性,软路由 篇一:openwrt共享打印机【上】【完美解决】HP10系打印异常问题...
  19. winuser.h(10105,3): error C2059: 语法错误:“(”
  20. 性能监控——cpu使用率过高,该怎么分析?

热门文章

  1. Linux服务器被攻击方式及防御措施?
  2. vue实现一个具有添加、删除、按关键字过滤的列表管理
  3. 反渗透设备:反渗透设备应用的基本原理与技术优势
  4. 真实的上海 IT 圈:张江男vs漕河泾男
  5. urllib抓取html数据,Python爬虫: 用urllib2写的抓取网页内容的简单示例
  6. 白头搔更短,SSTI惹人心!
  7. rdp协议打开 windows_RDP服务开启
  8. Redshift 简介
  9. Hadoop1000条笔记总汇
  10. 基于EVEBITD倍估值法的Alh对冲策(源代码)