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

 更新时间:2023年05月30日 08:36:11   作者: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 延迟调用的资料请关注脚本之家其它相关文章!

相关文章

  • Go Map并发冲突预防与解决

    Go Map并发冲突预防与解决

    这篇文章主要为大家介绍了Go Map并发冲突预防与解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 使用golang实现一个MapReduce的示例代码

    使用golang实现一个MapReduce的示例代码

    这篇文章主要给大家介绍了关于如何使用golang实现一个MapReduce,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Go语言的io输入输出流方式

    Go语言的io输入输出流方式

    Go语言中,输入输出流的处理通过io库中的Reader和Writer接口来实现,Reader接口定义了Read方法,用于从流中读取数据到程序中,Writer接口定义了Write方法,用于将数据写入到底层的数据流中,这些接口被许多标准库的类型所实现
    2024-10-10
  • 浅谈go中切片比数组好用在哪

    浅谈go中切片比数组好用在哪

    数组和切片都是常见的数据结构,本文将介绍Go语言中数组和切片的基本概念,同时详细探讨切片的优势,感兴趣的可以了解下
    2023-06-06
  • Go检查结构体中是否存在某个字段及创建结构体切片或映射

    Go检查结构体中是否存在某个字段及创建结构体切片或映射

    这篇文章主要为大家介绍了Go检查结构体中是否存在某个字段及创建结构体切片或映射实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go语言LeetCode题解682棒球比赛

    Go语言LeetCode题解682棒球比赛

    这篇文章主要为大家介绍了Go语言LeetCode题解682棒球比赛示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • gin自定义中间件解决requestBody不可重读(请求体取值)

    gin自定义中间件解决requestBody不可重读(请求体取值)

    这篇文章主要介绍了gin自定义中间件解决requestBody不可重读,确保控制器能够获取请求体值,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go语言中的Struct结构体

    Go语言中的Struct结构体

    这篇文章介绍了Go语言中的Struct结构体,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 详解Golang利用反射reflect动态调用方法

    详解Golang利用反射reflect动态调用方法

    这篇文章主要介绍了详解Golang利用反射reflect动态调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • Go语言tunny的workerWrapper使用教程示例

    Go语言tunny的workerWrapper使用教程示例

    这篇文章主要为大家介绍了Go语言tunny的workerWrapper使用教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07

最新评论