Golang学习笔记之延迟函数(defer)的使用小结
作者:学生黄哲 时间:2024-02-03 07:56:04
golang的defer优雅又简洁, 是golang的亮点之一。defer在声明时不会立即执行,而是在函数return后,再按照先进后出的原则依次执行每个defer,一般用于释放资源、清理数据、记录日志、异常处理等。
关键字defer于注册延迟调用。这些调用直到 ret 前才被执行,通常用于释放资源或错误处理。
一、当defer被声明时,其参数就会被实时解析
func a() {
i := 0
defer fmt.Println(i) //输出0,因为i此时就是0
i++
defer fmt.Println(i) //输出1,因为i此时就是1
return
}
二、当一个函数内多次调用 defer 时,Go 会把 defer 调用放入到一个栈中,随后按照先进后出的顺序执行。
func main() {
defer fmt.Println("1")
defer fmt.Println("2")
defer fmt.Println("3")
defer fmt.Println("4")
}
输出顺序为4321
使用defer逆序输出字符串
name := "Naveen你好"
fmt.Printf("%s\n", string(name))
fmt.Printf("逆序:")
defer fmt.Printf("\n")
for _, v := range []rune(name) {
defer fmt.Printf("%c", v)
}
输出:
Naveen你好
逆序:好你neevaN
三、defer 的实际应用
func (r rect) area(wg *sync.WaitGroup) {
if r.length < 0 {
fmt.Printf("rect %v's length should be greater than zero\n", r)
wg.Done()
return
}
if r.width < 0 {
fmt.Printf("rect %v's width should be greater than zero\n", r)
wg.Done()
return
}
area := r.length * r.width
fmt.Printf("rect %v's area %d\n", r, area)
wg.Done()
}
我们会发现上面wg.Done()被调用多次我们可以使用defer来优化代码
func (r rect) area(wg *sync.WaitGroup) {
defer wg.Done()
if r.length < 0 {
fmt.Printf("rect %v's length should be greater than zero\n", r)
return
}
if r.width < 0 {
fmt.Printf("rect %v's width should be greater than zero\n", r)
return
}
area := r.length * r.width
fmt.Printf("rect %v's area %d\n", r, area)
}
使用defer延时调用,会在程序结束之前调用
下面举个例子:
package main
import "fmt"
func deferTest(number int) int {
defer func() {
number++
fmt.Println("three:", number)
}()
defer func() {
number++
fmt.Println("two:", number)
}()
defer func() {
number++
fmt.Println("one:", number)
}()
return number
}
func main() {
fmt.Println("函数返回值:", deferTest(0))
}
上面的代码打印的结果是:
one: 1
two: 2
three: 3
函数返回值: 0
PS:defer 有一个重要的特性,即便函数抛出了异常,defer也会被执行的。这样就不会因为程序出现了错误,导致资源不会被释放了。
来源:https://www.jianshu.com/p/bbfe8095ee65
标签:Golang,延迟函数,defer
0
投稿
猜你喜欢
基于Go语言实现插入排序算法及优化
2024-05-22 10:18:05
100 个 Python 小例子(练习题二)
2021-02-09 10:15:31
python3 pillow模块实现简单验证码
2021-07-04 11:10:44
对Python3之方法的覆盖与super函数详解
2023-08-25 19:05:28
Django中信号signals的简单使用方法
2023-08-18 08:49:49
安装MySQL5.0后出现1607异常的解决办法
2009-02-26 15:52:00
python中pip安装库时出现Read timed out解决办法
2023-06-15 22:20:44
python是先运行metaclass还是先有类属性解析
2022-02-10 23:24:48
pandas中Timestamp类用法详解
2022-12-06 14:30:54
python游戏实战项目之智能五子棋简易版
2021-02-06 21:32:56
5个有趣的浏览器地址栏Javascript代码
2008-07-21 13:04:00
mysql 8.0.25 解压版安装配置方法图文教程
2024-01-13 06:56:25
浅析facebook的信息架构
2008-07-25 19:57:00
ubuntu 16.04下python版本切换的方法
2021-07-10 16:36:04
js中使用使用原型(prototype)定义方法的好处详解
2024-04-22 13:03:54
用生成器来改写直接返回列表的函数方法
2022-04-24 15:36:08
python通过colorama模块在控制台输出彩色文字的方法
2023-07-23 00:35:51
ASP.NET Core Authentication认证实现方法
2023-07-21 12:21:31
CentOS 7.2下MySQL的安装与相关配置
2024-01-16 23:21:29
python中的字符串占位符的"{0:2}"
2021-04-28 20:23:39