Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > go defer延迟调用

go defer延迟调用的使用场景示例详解

作者:Architecture

这篇文章主要为大家介绍了go defer延迟调用的使用场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

defer 简介

defer 通俗来讲就是延迟调用。defer 会在当前函数返回之前执行 defer 注册的函数。

例如: defer func_x() 这样语句会让你注册一个函数变量到 defer 的全局链表中,在 defer 语句所在的函数退出之前调用。

主要使用场景

panic 场景:这个是重要的一个特性,通常能简化我们的代码,确保无论任何场景,defer 的函数一定调用,通常用在锁或者资源的释放场景较多;

配套的两个行为代码可以放在最近的位置:创建&释放、加锁&放锁、前置&后置,使得代码更易读,编程体验优秀。最近的地方是哪里?下一行

延迟调用

package main
func main() {
    defer println("--- defer ---")
    println("--- end ---")
}

defer 会在main函数之前调用。

核心要点:

延迟调用:defer 语句本身虽然是 main 的第一行,但是 fmt.Println 是先打印的;

defer 关键字一定是处于函数上下文:defer 必须放在函数内部

LIFO

一个函数内有多个defer时,压栈式执行,后入先出。

package main
import "fmt"
func main() {
    defer func() {
        fmt.Println("1")
    }()
    defer func() {
        fmt.Println("2")
    }()
}

异常场景

注意:一定要先注册defer,放在函数第一行,放到如下代码return之前,是无法捕获异常的;

package main
import "fmt"
func main() {
    defer func() {
        if err := recover(); err != nil {
            fmt.Println("捕获panic", err)
        }
    }()
    var sliceOne []int
    sliceOne[0] = 1
    return
}

以上就是go defer 延迟调用的详细内容,更多关于go defer 延迟调用的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文