golang中defer的基本使用教程

作者:Free_YaW 时间:2023-07-03 01:19:02 

前言

第一次看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 := 10
defer func(a int) {
fmt.Println(a)
}(x)
x++

答案:

golang中defer的基本使用教程

为什么?

因为defer后面的函数在入栈的时候保存的是入栈那一刻的值,而当时x的值是10,所以后期对x修改,并不会影响栈内函数的值。

2.输出多少

x := 10
defer func(a *int) {
fmt.Println(*a)
}(&x)
x++

答案:

golang中defer的基本使用教程

为什么?

这里defer后面函数入栈的时候存入的执行变量x的指针。所以,后期x值改变的时候,输出结果也会改变。

3.输出多少

func test()(x int)  {
x = 10
defer func() {
x++
}()
return x
}

答案:

golang中defer的基本使用教程

为什么?

之前我们说过,return并不是原子性操作,是通过一个变量赋值和ret指令来完成的。

而上述例子中,是具名函数。即返回值带有名字。这样我们在执行defer的时候相当于修改了返回值的值。所以为11

看到这里,博主想到了闭包。和闭包有没有关系呢?

4.输出什么

func test1() int {
x := 10
defer func() {
x++
}()
// ans = x
// -------- defer x = x+1
// return x
return x
}

答案:

golang中defer的基本使用教程

为什么?
 

还是return语句的原因,博主已经在代码中给出提示。可见,非具名函数不会受到相应的影响。

对于defer暂时理解了这些,下次再见。

来源:https://blog.csdn.net/m0_46251547/article/details/123762669

标签:go,defer,用法
0
投稿

猜你喜欢

  • numpy.insert()的具体使用方法

    2021-12-23 15:33:34
  • javascript 网站常用的iframe分割

    2023-08-19 09:27:58
  • python检测某个变量是否有定义的方法

    2021-05-17 18:45:01
  • Python的Django框架中消息通知的计数器实现教程

    2021-03-22 04:13:43
  • JS:firefox 兼容性问题

    2009-08-01 16:20:00
  • python字符串过滤性能比较5种方法

    2021-09-26 18:35:25
  • 创建、调用JavaScript对象的方法集锦

    2024-02-25 08:01:03
  • Python中的heapq模块源码详析

    2023-09-23 12:07:23
  • MySQL借助DB实现分布式锁思路详解

    2024-01-16 03:17:13
  • Python利用正则表达式从字符串提取数字

    2021-03-22 22:52:39
  • Vue实现简单跑马灯特效

    2024-04-30 10:31:05
  • taro小程序添加骨架屏的实现代码

    2024-04-19 11:04:04
  • 网页颜色变黑白CSS代码 适合所有类型网站

    2010-04-21 10:37:00
  • Python还能这么玩之用Python做个小游戏的外挂

    2022-12-11 18:27:43
  • Python enumerate函数功能与用法示例

    2023-11-06 08:44:07
  • python数据可视化绘制世界人口地图

    2022-04-27 21:31:31
  • JavaScript中实现块作用域的方法

    2024-04-16 10:38:39
  • asp如何编写一个小数转换分数的函数?

    2009-11-08 19:01:00
  • Mysql中如何删除某个字段的最后四个字符

    2024-01-28 22:44:07
  • python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧(自定义信号与槽)详解与实例

    2022-02-07 05:22:10
  • asp之家 网络编程 m.aspxhome.com