当前位置: 首页 > article >正文

Go中的延时执行魔法:深入浅出defer用法

一、defer 介绍

1、defer 特性
  • 关键字 defer 用于注册延迟调用
  • 这些调用直到 return 前才被执行,因此,可以用来做资源清理
  • 多个 defer 语句,按先进后出的方式执行
  • defer 语句中的变量,在 defer 声明是就决定了
2、defer 用途
  • 关闭文件句柄
  • 锁资源释放
  • 数据库连接释放
3、defer 语句使用说明
  • defer 实现类似域栈,先进后出
  • 而且是在函数执行完成到 return 返回之间调用
package main

import "fmt"

func main() {
    fmt.PrintIn("start")
    defer fmt.Println(1)
	defer fmt.Println(2)
	defer fmt.Println(3)
	fmt.Println("end")
}

/*
start
end
3
2
1
 */
4、defer 执行时机
  • 在 Go 语言的函数中 return 语句在底层并不是原子操作,它分为给返回值赋值和 RET 指令两步
  • 而 defer 语句执行的时机就在放回值赋值操作后,RET 指令执行前
  • 具体如下图所示

5、defer 案例 
  • defer 注册要延迟执行的函数时该函数所有的参数都需要确定其值
package main

import "fmt"

func calc(index string,a,b int) int {
    ret := a + b
    fmt.PrintIn(indexer,a,b,ret)
    return ret
}

func main() {
    x := 1
    y := 2
    defer calc("AA",x,calc("A",x,y))
    x = 10
    defer calc("BB", x, calc("B", x, y))
    y = 20
}
/*
A 1 2 3
B 10 2 12
BB 10 12 22
AA 1 3 4
 */

二、defer 陷阱

1、defer 碰上闭包
  • 也就是说函数正常执行,由于闭包用到的变量 i 在执行的时候已经变成 4,所以输出全都是 4
package main
import "fmt"

func main() {
	var whatever [5]struct{}
	for i := range whatever {
		defer func() { fmt.Println(i) }()
	}
}
/*
4
4
4
4
4
 */

http://www.kler.cn/a/159267.html

相关文章:

  • 【redis】—— 环境搭建教程
  • 微信小程序进行md5加密 ,base64 转码
  • C/C++静态库引用过程中出现符号未定义的处理方式
  • 24.11.13 机器学习 特征降维(主成份分析) KNN算法 交叉验证(K-Fold) 超参数搜索
  • 一文了解Android中的AudioFlinger
  • PdServer:调用MidjourneyAPI完成静夜思图文生成
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • HTML5 基础总结
  • 周周爱学习之Redis重点总结
  • 程序员必看:查券助手返利机器人是如何实现的?
  • 每日一题(LeetCode)----字符串--反转字符串 II
  • 15、pytest的fixture调用fixture
  • 一部,即全部,十年超越之作一加12售价4299元起
  • C++ 函数详解
  • 高级搜索——伸展树Splay详解
  • 5-Tornado入门、程序的原理图、tornado不能使用同步代码的演示
  • Day14——数据结构和集合源码
  • Codeforces Round 913 (Div. 3)(A~G)
  • 网络安全威胁——中间人攻击
  • 牛客算法心得——kotori和素因子(dfs)
  • RK356x U-Boot研究所(命令篇)3.12 mtd命令的用法
  • WeakMap
  • Python实现FA萤火虫优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战
  • 17.认识下Docker之docker的核心原理(2)
  • 商务助理个人简历10篇
  • 轻量封装WebGPU渲染系统示例<40>- 多层材质的Mask混合(源码)