defer详解
defer使用场景
defer在Go语言中是一个十分常用的关键字,它的作用是:将其后面跟随的语句进行延迟处理
简单来说,就是程序先去干别的事情。最后再来做defer后面跟的东西
于是我们很容易就想到,defer可以用很多使用的场景
比如:
文件的关闭,资源的清理,解锁及记录时间,以及recover的使用
defer的一些特性
-
类似于栈的特性,所有的defer 语句都会像栈一样先进后出
-
执行时机:Go语言中的return语句并不是一个原子操作,它分为给返回值赋值和RET指令两步,而defer语句执行的时机其实就在返回值赋值操作之后,RET指令执行之前,如下图
两道defer面试题
func f1() int { //返回值没有取名
x := 5
defer func() {
x++
}()
return x //1.返回值赋值 2.defer 3.执行RET返回 //开辟了一份空间 return语句先将5赋值给x defer修改了x的值 但是RET命令执行的对象还是那个‘5’
}
func f2() (x int) { //返回值有名字
defer func() {
x++
}()
return 5 //修改的是x的值
}
func f3() (y int) {
x := 5
defer func() {
x++
}()
return x //y = x = 5 defer修改的是 x 真正返回的y还是5
}
func f4() (x int) {
defer func(x int) {
x++ //改的是函数值的副本 //如果这里是 defer func(x *int) { x ++ }(x)
}(x) //那么结果就会变成6
return 5
}
func main() {
fmt.Println(f1()) //5
fmt.Println(f2()) //6
fmt.Println(f3()) //5
fmt.Println(f4()) //5
}
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
//1.调用calc中的calc("A",x,y) 输出:"A",1,2,3 因为函数调用时会确定每个参数的值
//2.defer calc("AA",x,3)
//3.调用第二个calc中的calc("B",x,y) 此时x y是20 输出:"B",10,2,12
//4.defer calc("BB",x,12)
//5.先进后出 调用第二个calc 输出:"BB",10,12,22
//6.调用第二个calc 输出:"AA" 1,3,4
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!