聊聊golang的defer的使用

 更新时间:2020年12月02日 10:24:16   作者:codecraft  
这篇文章主要介绍了聊聊golang的defer的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


本文主要研究一下golang的defer

defer

  • return先赋值(对于命名返回值),然后执行defer,最后函数返回
  • defer函数调用的执行顺序与它们分别所属的defer语句的执行顺序相反
  • defer后面的表达式可以是func或者是method的调用,如果defer的函数为nil,则会panic

实例

实例1

// f returns 42
func f() (result int) {
  defer func() {
    // result is accessed after it was set to 6 by the return statement
    result *= 7
  }()
  return 6
}

这里return先给result赋值为6,之后执行defer,result变为42,最后返回42

实例2

func f() int {
  result := 6
  defer func() {
    // result is accessed after it was set to 6 by the return statement
    result *= 7
  }()
  return result
}

这里return确定返回值6,之后defer修改result,最后函数返回return确定的返回值

实例3

func multiDefer() {
  for i := 3; i > 0; i-- {
    defer func(n int) {
      fmt.Print(n, " ")
    }(i)
  }

  for i := 3; i > 0; i-- {
    defer fmt.Print(i, " ")
  }
}

多个defer函数,按顺序逆序执行,这里输出1 2 3

实例4

var fc func() string

func main() {
  fmt.Println("hello")
  defer fc()
}

由于defer指定的func为nil,这里panic

实例5

func main() {
  for i := 3; i > 0; i-- {
    defer func() {
      fmt.Print(i, " ")
    }()
  }
}

由于defer这里调用的func没有参数,等执行的时候,i已经为0,因而这里输出3个0

小结

defer可以拆解为return赋值,defer执行,最后代码返回三步;defer的顺序按逆序执行。

doc

Defer_statements
Golang之Defer
golang中defer执行时机与常见问题

到此这篇关于聊聊golang的defer的使用的文章就介绍到这了,更多相关golang defer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang监听ip数据包的实现步骤(golang纯享版)

    golang监听ip数据包的实现步骤(golang纯享版)

    这篇文章主要给大家介绍了golang监听ip数据包的实现步骤,本文以ip4 作为案例进行包抓取示范,ip6抓取与ip4方式异曲同工,可自行举一反三得出,文中通过图文结合给大家介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • go build 通过文件名后缀实现不同平台的条件编译操作

    go build 通过文件名后缀实现不同平台的条件编译操作

    这篇文章主要介绍了go build 通过文件名后缀实现不同平台的条件编译操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 大多数Go程序员都走过的坑盘点解析

    大多数Go程序员都走过的坑盘点解析

    这篇文章主要为大家介绍了大多数Go程序员都走过的坑盘点解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go语言包管理模式示例分析

    Go语言包管理模式示例分析

    这篇文章主要为大家介绍了Go语言包管理模式示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go语言学习之结构体和方法使用详解

    Go语言学习之结构体和方法使用详解

    这篇文章主要为大家详细介绍了Go语言中结构体和方法的使用,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-04-04
  • Go语言中的UTF-8实现

    Go语言中的UTF-8实现

    这篇文章主要介绍了Go语言中的UTF-8实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • Golang服务中context超时处理的方法详解

    Golang服务中context超时处理的方法详解

    在Go语言中,Context是一个非常重要的概念,它存在于一个完整的业务生命周期内,Context类型是一个接口类型,在实际应用中,我们可以使用Context包来传递请求的元数据,本文将给大家介绍Golang服务中context超时处理的方法和超时原因,需要的朋友可以参考下
    2023-05-05
  • Go接口的用法详解

    Go接口的用法详解

    本文主要介绍了Go接口的用法详解,包括定义接口、实现接口、使用接口、空接口等,通过接口,可以实现多态性,即一个对象可以实现多个接口,从而实现不同接口的行为,感兴趣的可以了解一下
    2023-11-11
  • 如何使用golang实现traceroute

    如何使用golang实现traceroute

    这篇文章主要介绍了如何使用golang实现traceroute,该工具在linux环境下的命令是traceroute或者tracepath,在windows下命令是tracert,本文给大家详细讲解需要的朋友可以参考下
    2023-04-04
  • 基于Golang实现YOLO目标检测算法

    基于Golang实现YOLO目标检测算法

    目标检测是计算机视觉领域的重要任务,它不仅可以识别图像中的物体,还可以标记出物体的位置和边界框,YOLO是一种先进的目标检测算法,以其高精度和实时性而闻名,本文将介绍如何使用Golang实现YOLO目标检测算法,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2023-11-11

最新评论