【defer】升级版1.13中的defer|Go主题月

简介: 在1.13版本中,go语言改进了defer的创建。改为了直接用栈来存储_defer结构体。然后把栈上分配的_defer结构体注册到defer链表通过这样的方式避免在堆上分配_defer结构体。减少了堆和栈之间频繁复制导致的额外内存开销。

网络异常,图片无法展示
|

1.13的defer


在1.13版本中,go语言改进了defer的创建。改为了直接用栈来存储_defer结构体。然后把栈上分配的_defer结构体注册到defer链表通过这样的方式避免在堆上分配_defer结构体。减少了堆和栈之间频繁复制导致的额外内存开销。

但是,值得注意的是,1.13版本中并不是所有defer都能够在栈上分配。循环中的defer,无论是显示的for循环,还是goto形成的隐式循环,都只能使用1.12版本中的处理方式在堆上分配。即使只执行一次的for循环也是一样。

例如:

//显示循环
for i:=0; i< n; i++{
    defer B(i)
}
......
//隐式循环
again:
    defer B()
    if i<n {
        n++
        goto again
    }

所以在1.13版本中也保存了1.12的defer特性。

图解

在新版本中_defer的结构体新加了一个字段heap用来判断结构是在堆上还是在栈上。然后通过编译,把_defer结构体分配到栈上,help字段设为false。其他执行步骤与1.12没有太大的差别。

网络异常,图片无法展示
|

除了分配位置的不同,栈上分配和堆上分配执行流程并没有本质的不同,而该方法可以适用于绝大多数的场景,与堆上分配相比,该方法可以将 defer 关键字的额外开销降低 30%。

前景回顾

大家也可以看看上篇文章介绍1.12版本的defer

【defer】1.12版本中的defer|Go主题月

目录
相关文章
|
4月前
|
Go
Go语言中defer的执行顺序详解
【2月更文挑战第22天】
68 4
|
1月前
|
存储 Go
掌握 Go 语言的 defer 关键字
掌握 Go 语言的 defer 关键字
|
13天前
|
Go
实验深度理解Go中try...catch...的panic、defer、recover用法
文章通过实验代码演示了Go语言中如何使用panic、defer和recover函数来模拟try...catch...的异常处理机制,并详细解释了每个函数的作用和在异常处理中的使用场景。
24 0
|
4月前
|
Go 开发者
Golang深入浅出之-Go语言 defer、panic、recover:异常处理机制
Go语言中的`defer`、`panic`和`recover`提供了一套独特的异常处理方式。`defer`用于延迟函数调用,在返回前执行,常用于资源释放。它遵循后进先出原则。`panic`触发运行时错误,中断函数执行,直到遇到`recover`或程序结束。`recover`在`defer`中捕获`panic`,恢复程序执行。注意避免滥用`defer`影响性能,不应对可处理错误随意使用`panic`,且`recover`不能跨goroutine捕获panic。理解并恰当使用这些机制能提高代码健壮性和稳定性。
77 2
|
4月前
|
Java Go 区块链
【Go语言专栏】Go语言中的延迟执行与defer语句
【4月更文挑战第30天】Go语言的延迟执行与defer语句用于资源释放和错误处理。defer通过关键字定义,函数返回时执行,顺序与定义相反。参数在定义时求值。应用包括资源释放、错误处理、成对操作和函数包装,是Go编程的关键特性。
38 0
|
4月前
|
网络协议 BI Go
Go-异常处理(defer recover panic)
Go-异常处理(defer recover panic)
59 0
|
9月前
|
Go
go defer用法_类似与python_java_finially
go defer用法_类似与python_java_finially
54 0
golang 之 defer(统计函数执行时间)
1 package main 2 3 import ( 4 "fmt" 5 "time" 6 ) 7 8 func sum(a ...int) int { 9 defer trace("sum")() // note:不要忘记defe...
1395 0
|
1天前
|
程序员 Go PHP
为什么大部分的 PHP 程序员转不了 Go 语言?
【9月更文挑战第8天】大部分 PHP 程序员难以转向 Go 语言,主要因为:一、编程习惯与思维方式差异,如语法风格和编程范式;二、学习成本高,需掌握新知识体系且面临项目压力;三、职业发展考量,现有技能价值及市场需求不确定性。学习新语言虽有挑战,但对拓宽职业道路至关重要。
22 10
|
2天前
|
算法 程序员 Go
PHP 程序员学会了 Go 语言就能唬住面试官吗?
【9月更文挑战第8天】学会Go语言可提升PHP程序员的面试印象,但不足以 solely “唬住” 面试官。学习新语言能展现学习能力、拓宽技术视野,并增加就业机会。然而,实际项目经验、深入理解语言特性和综合能力更为关键。全面展示这些方面才能真正提升面试成功率。
20 10