脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Golang - Go 语言中 defer 使用时有哪些陷阱?

Go 语言中 defer 使用时有哪些陷阱?

2024-01-08 15:32Golang语言开发栈 Golang

本文主要介绍在使用 defer​ 语句时可能会遇到的陷阱。分别是 defer​ 语句不可以在 return​ 语句之后;defer 语句执行的匿名函数,匿名函数的参数会被预先处理。

01 、介绍

defer 的使用方式是在其后紧跟一个函数调用或方法调用,确保在其所在的函数体返回之前执行其调用的函数或方法。

在 Go 语言中,defer 一般用于资源释放,或使用 defer 调用一个匿名函数,在匿名函数中使用 recover() 处理异常 panic。

在使用 defer 时,也很容易遇到陷阱,本文我们介绍使用 defer 时有哪些陷阱。

02、 defer 陷阱

defer 语句不可以在 return 语句之后。

示例代码:

func main() {
 name := GetUserName("phper")
 fmt.Printf("name:%s\n", name)
 if name != "gopher" {
  return
 }
 defer fmt.Println("this is a defer call")
}

func GetUserName(name string) string {
 return name
}

输出结果:

name:phper

阅读上面这段代码,我们在 return 语句之后执行 defer 语句,通过输出结果可以发现 defer 语句调用未执行。

虽然 defer 可以在函数体中的任意位置,我们也是需要特别注意使用 defer 的位置是否可以执行。

defer 语句执行匿名函数,参数预处理。

示例代码:

func main() {
 var count int64
 defer func(data int64) {
  fmt.Println("defer:", data)
 }(count + 1)
 count = 100
 fmt.Println("main:", count)
}

输出结果:

main: 100
defer: 1

阅读上面这段代码,首先我们定义一个类型为 int64 的变量 count,然后使用 defer 语句执行一个匿名函数,匿名函数传递参数为 count + 1,最终 main 函数输出 100,defer 执行的匿名函数输出 1。

因为在执行 defer 语句时,执行了 count + 1,并先将其存储,等到 defer 所在的函数体 main 执行完,再执行 defer 语句调用的匿名函数的函数体中的代码。

03 、总结

本文主要介绍在使用 defer 语句时可能会遇到的陷阱。分别是 defer 语句不可以在 return 语句之后;defer 语句执行的匿名函数,匿名函数的参数会被预先处理。

读者朋友们在使用 Go 语言的 defer 语句时,还遇到过哪些陷阱?

原文地址:https://mp.weixin.qq.com/s/g6ohhBBQd0u4PzD1KhnKCA

延伸 · 阅读

精彩推荐
  • GolangGo 语言入门学习之时间包

    Go 语言入门学习之时间包

    这篇文章主要介绍了Go 语言入门学习之时间包,GO 语言提供了 ​​time​​包来测量和显示时间,下文关于GO时间包的相关介绍需要的小伙伴可以参考一下...

    宇宙之一粟7292022-09-28
  • GolangGo本地测试小技巧解耦任务拆解

    Go本地测试小技巧解耦任务拆解

    这篇文章主要为大家介绍了Go本地测试解耦任务拆解及沟通详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    王中阳Go5982022-10-24
  • Golang使用docker构建golang线上部署环境的步骤详解

    使用docker构建golang线上部署环境的步骤详解

    这篇文章主要介绍了使用docker构建golang线上部署环境的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的...

    jackluo7562020-05-11
  • GolangGolang中struct{}和struct{}{}的区别解析

    Golang中struct{}和struct{}{}的区别解析

    这篇文章主要介绍了Golang中struct{}和struct{}{}的区别,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参...

    路多辛8822023-03-19
  • Golang一起来用GoLand开发第一个Go程序

    一起来用GoLand开发第一个Go程序

    当您在编辑器中工作时GoLand 会分析您的代码,寻找优化方法,并检测潜在和实际问题,下面这篇文章主要给大家介绍了关于用GoLand开发第一个Go程序的相关资料...

    桌子椅子凳子。9452022-12-25
  • GolangCMD下执行Go出现中文乱码的解决方法

    CMD下执行Go出现中文乱码的解决方法

    需要在Go写的服务里面调用命令行或者批处理,并根据返回的结果做处理。但是windows下面用cmd返回中文会出现乱码,本文就详细的介绍一下解决方法,感兴...

    ourLang10312022-01-20
  • GolangGo 提问:值为 Nil 能调用函数吗?

    Go 提问:值为 Nil 能调用函数吗?

    今天给大家分享了一个 Go 语言里面的一个小细节,平时可能很多人没注意到,毕竟 IDE 也会标黄,会避开这个问题点。...

    脑子进煎鱼了9672022-01-05
  • Golang如何有效控制 Go 线程数?

    如何有效控制 Go 线程数?

    前阵子,在读者交流群中有人提到 Go 默认设置的最大线程数的问题:如果超过一万个 G (挂载于 M 上)阻塞于系统调用,那么程序就会被挂掉。这是对的,因...

    Golang技术分享8842021-10-26