聊聊golang的defer的使用

作者:codecraft 时间:2023-07-21 13:15:02 


本文主要研究一下golang的defer

defer

  • return先赋值(对于命名返回值),然后执行defer,最后函数返回

  • defer函数调用的执行顺序与它们分别所属的defer语句的执行顺序相反

  • defer后面的表达式可以是func或者是method的调用,如果defer的函数为nil,则会panic

实例

实例1


// f returns 42
func f() (result int) {
 defer func() {
   // result is accessed after it was set to 6 by the return statement
   result *= 7
 }()
 return 6
}

这里return先给result赋值为6,之后执行defer,result变为42,最后返回42

实例2


func f() int {
 result := 6
 defer func() {
   // result is accessed after it was set to 6 by the return statement
   result *= 7
 }()
 return result
}

这里return确定返回值6,之后defer修改result,最后函数返回return确定的返回值

实例3


func multiDefer() {
 for i := 3; i > 0; i-- {
   defer func(n int) {
     fmt.Print(n, " ")
   }(i)
 }

for i := 3; i > 0; i-- {
   defer fmt.Print(i, " ")
 }
}

多个defer函数,按顺序逆序执行,这里输出1 2 3

实例4


var fc func() string

func main() {
 fmt.Println("hello")
 defer fc()
}

由于defer指定的func为nil,这里panic

实例5


func main() {
 for i := 3; i > 0; i-- {
   defer func() {
     fmt.Print(i, " ")
   }()
 }
}

由于defer这里调用的func没有参数,等执行的时候,i已经为0,因而这里输出3个0

小结

defer可以拆解为return赋值,defer执行,最后代码返回三步;defer的顺序按逆序执行。

doc

Defer_statements
Golang之Defer
golang中defer执行时机与常见问题

来源:https://segmentfault.com/a/1190000038348618

标签:golang,defer
0
投稿

猜你喜欢

  • 利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式

    2021-02-07 14:24:18
  • php中-> 、=>、::、$this->四种常见符号使用方法技巧

    2023-05-30 07:46:24
  • 解决vue项目获取dom元素宽高总是不准确问题

    2024-04-28 09:32:14
  • 第一类工厂与哈希对象

    2009-12-28 13:14:00
  • Python利用matplotlib实现制作动态条形图

    2021-06-11 05:29:15
  • 使用python从三个角度解决josephus问题的方法

    2022-02-22 02:19:55
  • PyTorch 如何自动计算梯度

    2023-08-13 14:44:20
  • OpenCV Python实现拼图小游戏

    2021-07-30 18:10:34
  • python获取指定时间段内特定规律的日期列表

    2021-02-09 02:16:25
  • Python设计模式之外观模式实例详解

    2022-01-18 16:39:37
  • 教你如何使用Python selenium

    2022-05-15 11:13:50
  • Python IDLE清空窗口的实例

    2023-11-22 17:59:23
  • Ext2.0.2经典的一个JS组件(带EXT中文手册)

    2009-04-13 12:24:00
  • 简单实用的图片播放器1.0(Javascript + css )

    2008-07-16 10:39:00
  • 《写给大家看的设计书》阅读笔记之重复原则

    2009-07-12 15:36:00
  • 分享10个Js的小型库,效果真的很棒

    2009-08-27 15:38:00
  • Django 对IP访问频率进行限制的例子

    2022-02-14 05:40:38
  • 深入讲解Python函数中参数的使用及默认参数的陷阱

    2022-04-21 20:09:14
  • 巧妙的自关联运用

    2012-10-07 10:55:58
  • asp 删除数据并同时删除图片的代码

    2011-02-28 10:39:00
  • asp之家 网络编程 m.aspxhome.com