Golang笔记

理解 golang defer 的实行

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

下面是一个简单的例子:

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 好用,但滥用 可能会导致性能问题,尤其是在一个 "大循环" 里。

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()
    }
}

输出

BenchmarkTest" 50000000 43 ns/op
BenchmarkTestDefer 20000000 128 ns/op
本文网址: https://golangnote.com/topic/28.html (转载注明出处)
关于GolangNote:记录在工作中使用golang 遇到、面临的相关问题及解决方法。如果你在这里获得一些知识或信息,解决你的编程问题,请考虑捐赠给不幸的人或者你喜欢的慈善机构,除捐赠外,种植树木、志愿服务或减少排碳的行为也很有益处。如果你有任何问题可以在下面 留言
Be the first to comment!
Captcha image
Relative Articles