Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 语言中 defer 使用时有哪些陷阱?

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

作者头像
frank.
发布于 2024-01-10 08:45:59
发布于 2024-01-10 08:45:59
15200
代码可运行
举报
运行总次数:0
代码可运行

01 、介绍

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

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

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

02、defer 陷阱

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

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
name:phper

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

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

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

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
 var count int64
 defer func(data int64) {
  fmt.Println("defer:", data)
 }(count + 1)
 count = 100
 fmt.Println("main:", count)
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 语句时,还遇到过哪些陷阱?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-01-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言开发栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
尝试通过MQTT向thingsboard上的设备发送数据
在thingsboard demo网站上注册一个用户 https://demo.thingsboard.io/signup
lilugirl
2020/02/18
4.8K0
尝试通过MQTT向thingsboard上的设备发送数据
ThingsBoard 物联网平台-代码结构分析
ThingsBoard 是一个备受瞩目的开源物联网平台,其优秀的性能和高效的性能得到了广大开发者的认可。ThingsBoard 是用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议 - MQTT、CoAP 和 HTTP 实现设备连接,并支持云和本地部署。Thingsboard 具有可伸缩性、容错性和性能优越的特点。
acc8226
2022/05/25
4.3K0
使用ThingsBoard查看物联网数据
ThingsBoard是一个开源平台,用于收集和可视化物联网设备的数据。可以将来自任意数量设备的数据发送到云服务器,在云服务器中可以通过可自定义的仪表板查看或共享。
Techeek
2018/09/19
13.9K1
使用ThingsBoard查看物联网数据
使用jenkins自部署Coding项目
文档地址:http://codingcorp.coding.me/coding-openapi/ci/jenkins/
易墨
2018/09/14
2.9K0
使用jenkins自部署Coding项目
Mac安装vue.js开发环境
本来以为在Mac上搭建vue.js的环境挺简单的,谁知遇到各种问题(可能是RP问题),网上解决的方法也寥寥无几,这里就记录下遇到的坑。
DannyHoo
2019/02/25
5.7K0
Mac安装vue.js开发环境
ES | Linux下基于ElasticSearch的head插件安装
wget https://nodejs.org/dist/v10.15.2/node-v10.15.2-linux-x64.tar.xz
码神联盟
2019/07/31
4.8K0
ES | Linux下基于ElasticSearch的head插件安装
【Elasticsearch全文搜索引擎实战】之Head插件实践 简介1. ES 5.0+ 版本Head插件安装2. 配置3. 启动4. 访问5. 安全问题(严重)6. 小结
Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github也都采用它做的搜索。 更多Elasticsearch的相关知识,请阅读官网《Elasticsearch: 权威指南》。
mantou
2019/02/13
1.1K0
【Elasticsearch全文搜索引擎实战】之Head插件实践
		简介1. ES 5.0+ 版本Head插件安装2. 配置3. 启动4. 访问5. 安全问题(严重)6. 小结
【ES三周年】linux-centos7安装elasticsearch-head插件
①从官网https://nodejs.org/en/download下载 node-v8.11.3-linux-x64.tar.xz
张同学tty
2023/04/03
1.6K0
【ES三周年】linux-centos7安装elasticsearch-head插件
Webpack搭建ES6开发环境(部分摘自网络)
首先要有node环境,进入Node.js的官网,选择对应系统下载安装包。安装node后集成了npm管理器
江一铭
2022/07/05
2830
Vue安装及环境配置、开发工具
大家好,又见面了,我是你们的朋友全栈君。 本文主要介绍了Vue的安装及环境配置,新建vue项目,简单介绍vue开发工具和项目结构。
全栈程序员站长
2022/06/30
1.4K0
Vue安装及环境配置、开发工具
NodeJS 初学之安装配置环境
1.环境安装 操作系统: Ubuntu 16.04.2 LTS 1.1安装nvm ryan@ryan-900X5L:~/temp$ curl https://raw.githubusercontent.com/creationix/nvm/v0.33.4/install.sh | bash Note v0.33.4 is the latest version from creationix/nvm 安装好后,关闭重新打开terminal,输入nvm可以验证是否安装 安装目录默认是~/.nvm 使用淘宝镜像
Ryan-Miao
2018/03/14
1.2K0
物联网时代-跟着Thingsboard学IOT架构-CoAP设备协议
演示视频请移步: https://james-1258744956.cos.ap-shanghai.myqcloud.com/thingsboard/coap-thingsboard.mp4
sanshengshui
2019/07/26
2.4K0
物联网时代-跟着Thingsboard学IOT架构-CoAP设备协议
Vue开发环境搭建全过程,一步一个坑
Vue这里就不多作介绍了,首先我们要安装好整个开发环境,其实Windows和Mac的整个过程基本一样
一墨编程学习
2018/09/14
9640
Vue开发环境搭建全过程,一步一个坑
Node.js安装
希望将全模块所在路径和缓存路径放在我node.js安装的文件夹中,则在我安装的文件夹D:\software\tools\node下创建两个文件夹node_global及node_cache如下图
鱼找水需要时间
2023/02/16
1.9K0
Node.js安装
使用Jenkins来实现内部的持续集成流程(上)
Jenkins和TeamCity都是大杀器,用于搭建内部持续集成环境都是妥妥的。本篇主要介绍Jenkins的安装,下篇将介绍相关配置和使用。
心莱科技雪雁
2019/05/14
4900
使用Jenkins来实现内部的持续集成流程(上)
聊聊NPM镜像那些险象环生的坑
由于国内网络环境的原因,在执行npm i安装项目依赖过程中,肯定会遇上安装过慢或安装失败的情况。有经验的同学通常会在安装完「Node」时顺便把「NPM镜像」设置成国内的淘宝镜像。
JowayYoung
2020/06/15
5.5K0
使用Jenkins来实现内部的持续集成流程(上)
Jenkins和TeamCity都是大杀器,用于搭建内部持续集成环境都是妥妥的。本篇主要介绍Jenkins的安装,下篇将介绍相关配置和使用。
雪雁-心莱科技
2019/05/14
5080
Cypress学习1-windows环境npm安装Cypress
web技术已经进化了,web的测试技术最终还是跟上了脚步,新一代的web自动化技术出现了? Cypress可以对在浏览器中运行的任何东西进行快速、简单和可靠的测试。
上海-悠悠
2020/05/12
1.8K0
Nodejs安装教程
本教程演示的环境:win 10 64位 node.js下载官网: nodejs官网.
全栈程序员站长
2022/09/13
3.8K0
Nodejs安装教程
Microi吾码低代码平台:前端源码的本地运行探索
• 对于某些依赖特定工具链或包的项目,可能有不同的要求,但大多数前端项目都可以跨平台运行
DARLING Zero two
2024/12/24
2030
Microi吾码低代码平台:前端源码的本地运行探索
相关推荐
尝试通过MQTT向thingsboard上的设备发送数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验