聊聊golang的defer的使用

 更新时间:2020-12-09 21:04:50   作者:佚名   我要评论(0)




本文主要研究一下golang的defer
defer



return先赋值(对于命名返回值),然后执行defer,最后函数返回
defer函数调用的执行顺序与它们分别所属的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学习笔记之延迟函数(defer)的使用小结
  • golang中defer的关键特性示例详解
  • golang中defer的使用规则详解
  • Golang巧用defer进行错误处理的方法

相关文章

  • 聊聊golang的defer的使用

    聊聊golang的defer的使用

    序 本文主要研究一下golang的defer defer return先赋值(对于命名返回值),然后执行defer,最后函数返回 defer函数调用的执行顺序与它们分别所属的defer语
    2020-12-09
  • 部署Go语言项目的 N 种方法(小结)

    部署Go语言项目的 N 种方法(小结)

    本文以部署 Go Web 程序为例,介绍了在 CentOS7 服务器上部署 Go 语言程序的若干方法。 部署Go语言项目 本文以部署 Go Web 程序为例,介绍了在 CentOS7 服务器上部署
    2020-12-09
  • 基于gin的golang web开发之认证利器jwt

    基于gin的golang web开发之认证利器jwt

    JSON Web Token(JWT)是一种很流行的跨域认证解决方案,JWT基于JSON可以在进行验证的同时附带身份信息,对于前后端分离项目很有帮助。 eyJhbGciOiJIUzI1NiIsInR5c
    2020-12-09
  • go语言入门环境搭建及GoLand安装教程详解

    go语言入门环境搭建及GoLand安装教程详解

    Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC
    2020-12-09
  • mac下安装golang框架iris的方法

    mac下安装golang框架iris的方法

    安装前准备: 设置GOPROXY代理 参考:https://goproxy.cn/ 我使用的是下面的两条命令: $ go env -w GO111MODULE=on $ go env -w GOPROXY=https://goproxy.cn,dir
    2020-12-09
  • goland 设置注释模板的过程图文详解

    goland 设置注释模板的过程图文详解

    网上找了一些办法 都没有说到关键点: 梳理一下设置步骤如下,以及避免的坑。 新建文件自动加注释: Preferences | Editor | File and Code Templates 打开go File
    2020-12-09
  • 详解Golang Iris框架的基本使用

    详解Golang Iris框架的基本使用

    Iris介绍 编写一次并在任何地方以最小的机器功率运行,如Android、ios、Linux和Windows等。它支持Google Go,只需一个可执行的服务即可在所有平台。 Iris以简单而强
    2020-12-09
  • 详解prometheus监控golang服务实践记录

    详解prometheus监控golang服务实践记录

    一、prometheus基本原理介绍 prometheus是基于metric采样的监控,可以自定义监控指标,如:服务每秒请求数、请求失败数、请求执行时间等,每经过一个时间间隔,数据
    2020-12-09
  • goland服务热重启的配置文件

    goland服务热重启的配置文件

    开发web api或web项目,修改源码后,无需手动重启即可查看效果,使用air即可实现。 安装air:go get -v -u github.com/cosmtrek/air(或下载所有源码后,go build,
    2020-12-09
  • go特性之数组与切片的问题

    go特性之数组与切片的问题

    数组: 复制传递(不要按照c/c++的方式去理解,c/c++中数组是引用传递),定长 切片: 引用传递,底层实现是3个字段 array(数组) + len(长度) +cap(容量) g
    2020-12-09

最新评论