GolangNote

Golang笔记

理解 golang defer 的实行

Permalink

关键字 defer 用于注册延迟调用。这些调用直到 return 前才被执行,通常⽤用于释放资源或错误处理。

理解 golang defer  的实行

下面是一个简单的例子:

Go: defer
1
2
3
4
5
6
7
8
9
10
11
func test() error {
    f, err := os.Create("test.txt")
    if err != nil {
        return err
    }

    defer f.Close() // 注册调用,而不是注册函数。必须提供参数,哪怕为空。

    f.WriteString("Hello, World!")
    return nil
}

多个 defer 注册,按 FILO 次序执行。哪怕函数或某个延迟调用发生错误,这些调用依旧会被执行。

defer 好用,但滥用 可能会导致性能问题,尤其是在一个 "大循环" 里。

Go: 多个defer
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var lock sync.Mutex

func test() {
    lock.Lock()
    lock.Unlock()
}

func testdefer() {
    lock.Lock()
    defer lock.Unlock()
}

func BenchmarkTest(b *testing.B) {
    for i := 0; i < b.N; i++ {
        test()
    }
}

func BenchmarkTestDefer(b *testing.B) {
    for i := 0; i < b.N; i++ {
        testdefer()
    }
}

输出

plaintext:
1
2
BenchmarkTest" 50000000 43 ns/op
BenchmarkTestDefer 20000000 128 ns/op

本文网址: https://golangnote.com/topic/28.html 转摘请注明来源

Related articles

golang Selenium WebDriver 使用记录

Selenium WebDriver 直接通过浏览器自动化的本地接口来调用浏览器,以达到模拟浏览器行为的操作,如点击、选择、鼠标移动等。下面是记录个人使用golang 驱动的记录。...

Golang 生成防识别的图片验证码

验证码 captcha 是对抗密码强力破解、垃圾信息的有效方式,一般用于用户注册、登录,当检测到频繁发帖时也会启用验证码。下面介绍用golang 生成防机器识别的图片验证码。...

golang interface 概念理解

比如有一些不同的数据结构structs (Models),都有相同的函数,如(Update, Delete, Show),这时候应该引入interface。...

Golang 数据库 Bolt 碎片整理

Bolt 是一个优秀、纯 Go 实现、支持 ACID 事务的嵌入式 Key/Value 数据库。但在使用过程中会有很多空间碎片。一般数据库占用的空间是元数据空间的 1.5~4 倍。Bolt 没有内置的压缩功能,需要手动压缩。...

Golang Range 的性能提升Tip

Go 语言里使用 range 可以方便遍历数组(array)、切片(slice)、字典(map)和信道(chan)。这里主要关注他们的性能。...

Write a Comment to "理解 golang defer 的实行"

Submit Comment Login
Based on Golang + fastHTTP + sdb | go1.22.3 Processed in 0ms