GO语言基础教程(91)Go函数的延迟调用之匿名函数的延迟调用:Go语言defer的隐藏技能:匿名函数延迟调用全解析

关键词:Go语言、defer、匿名函数、延迟调用

一、defer与匿名函数:Go语言中的延迟魔法

在Go语言的世界里,defer语句就像一个细心的小助手,它会把我们的函数调用"存起来",等到当前函数即将返回时再执行。这听起来简单,但与匿名函数结合后,它能发挥出令人惊叹的威力。

什么是defer? defer是Go语言提供的一种延迟调用机制,它允许我们将一个函数调用推迟到当前函数返回前执行。无论当前函数是正常返回还是由于异常导致返回,defer语句都能保证被执行。

匿名函数的魅力 匿名函数,也称为闭包,是没有名称的函数,可以在代码中直接定义和使用。当defer遇上匿名函数,就形成了一种强大的编程模式:

func main() {
    defer func() {
        fmt.Println("我在函数最后执行!")
    }()
    
    fmt.Println("我先执行")
    // 更多代码...
}

运行这段代码,你会看到:

我先执行
我在函数最后执行!

defer执行顺序 当一个函数中有多个defer语句时,它们会按照**后进先出(LIFO)**的顺序执行。也就是说,最后一个defer语句会最先执行,而第一个defer语句会最后执行:

func main() {
    defer fmt.Print("1")
    defer fmt.Print("2")
    defer fmt.Print("3")
    defer fmt.Print("4")
}

这段代码会输出"4321",而不是"1234"。

二、defer的隐藏功能:函数入口和出口的完美搭档

你可能不知道,defer有一个隐藏功能——它可以在任何函数的开始后和结束前执行配对的代码。这个功能在网上的教程和书籍中很少提到,但却极其有用。

实现原理 要使用这个功能,需要创建一个函数并使它本身返回另一个函数,返回的函数将作为真正的延迟函数。在defer语句调用父函数后在其上添加额外的括号来延迟执行返回的子函数:

func main() {
    defer greet()() 
    fmt.Println("Some code here...")
}

func greet() func() {
    fmt.Println("Hello!")
    return func() { fmt.Println("Bye!") } // this will be deferred
}

输出内容为:

Hello!
Some code here...
Bye!

实际应用:性能监控 利用这个特性,我们可以轻松实现函数的性能监控:

func measure(name string) func() {
    start := time.Now()
    fmt.Printf("Starting function %s\n", name)
    return func() { 
        fmt.Printf("Exiting function %s after %s\n", name, time.Since(start)) 
    }
}

func example() {
    defer measure("example")()
    fmt.Println("Some code here")
    time.Sleep(100 * time.Millisecond
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值