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 延迟调用的资料请关注脚本之家其它相关文章!

相关文章

  • Go1.18新特性使用Generics泛型进行流式处理

    Go1.18新特性使用Generics泛型进行流式处理

    这篇文章主要为大家介绍了Go1.18新特性使用Generics泛型进行流式处理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Windows环境下vscode-go安装笔记(不支持32位)

    Windows环境下vscode-go安装笔记(不支持32位)

    这篇文章主要介绍了Windows环境下vscode-go安装笔记(不支持32位),需要的朋友可以参考下
    2017-02-02
  • Golang实现四层负载均衡的示例代码

    Golang实现四层负载均衡的示例代码

    做开发的同学应该经常听到过负载均衡的概念,今天我们就来实现一个乞丐版的四层负载均衡,并用它对mysql进行负载均衡测试,感兴趣的可以了解一下
    2023-07-07
  • Go语言中字符串拼接的方法总结

    Go语言中字符串拼接的方法总结

    在Go语言中,我们可以使用+操作符、bytes.Buffer、strings.Builder等方法来拼接字符串,本文主要为大家介绍了这些常用方法的实现以及性能对比,感兴趣的小伙伴可以了解下
    2023-11-11
  • go语言语法基础的全面梳理(适合入门)

    go语言语法基础的全面梳理(适合入门)

    这篇文章主要介绍了go语言语法基础的相关资料,从基础语法到并发编程,涵盖变量声明、数据类型、流程控制、函数、接口、错误处理及并发编程,全面覆盖Go语言核心特性,需要的朋友可以参考下
    2026-06-06
  • Golang实现图片上传功能的示例代码

    Golang实现图片上传功能的示例代码

    这篇文章主要和大家分享一下如何利用Golang实现图片上传功能,文中的实现步骤讲解详细,对我们学习有一定的参考价值,需要的可以参考一下
    2022-05-05
  • go语言实现银行卡号Luhn校验

    go语言实现银行卡号Luhn校验

    这篇文章主要为大家介绍了go语言Luhn校验测试银行卡号码的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • Go实现MD5加密的三种方法小结

    Go实现MD5加密的三种方法小结

    本文主要介绍了Go实现MD5加密的三种方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • golang如何使用gos7读取S7200Smart数据

    golang如何使用gos7读取S7200Smart数据

    文章介绍了如何使用Golang语言的Gos7工具库读取西门子S7200Smart系列PLC的数据,通过指定数据块号、起始字节偏移量和数据长度,可以精确读取所需的数据,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Go 协程超时控制的实现

    Go 协程超时控制的实现

    本文主要介绍了Go 协程超时控制的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08

最新评论