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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
FreeRTOS 信号量
FreeRTOS 信号量和互斥锁是基于队列实现的, 队列介绍见 << FreeRTOS 消息队列 >>。 使用信号量需要在源文件中包含头文件 semphr.h , 该文件定义了信号量的 API, 实际我们使用的信号量 API 都是宏定义, 宏的实际是队列提供的函数。
orientlu
2018/09/13
2.3K0
FreeRTOS 信号量
嵌入式系统FreeRTOS — 互斥信号量
互斥信号量可以在资源保护的时候很有帮助。用于控制在两个或多个任务间访问共享资源。任务1里面用互斥,那么任务2只能等任务1访问完再访问同一个变量。
用户4645519
2020/09/07
1.6K0
嵌入式系统FreeRTOS — 互斥信号量
FreeRTOS内核应用开发手记
FreeRTOS内核应用开发学习手记移植任务状态迁移任务创建与删除任务挂起与恢复任务延时消息队列信号量事件软件定时器任务通知内存管理
小锋学长生活大爆炸
2020/08/13
6330
FreeRTOS内核应用开发手记
FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用
串口中断属于STM32本身的资源,不涉及到FreeRTOS,但可与FreeRTOS配合使用。
xxpcb
2020/08/04
4K0
韦东山freeRTOS系列教程之【第七章】互斥量(mutex)
在多任务系统中,任务A正在使用某个资源,还没用完的情况下任务B也来使用的话,就可能导致问题。
韦东山
2021/12/08
1.5K0
韦东山freeRTOS系列教程之【第七章】互斥量(mutex)
freeRTOS信号量学习
信号量同样是RTOS学习中很重要的一节,信号量可以用在共享资源或者同步任务中,对执行权的控制,谁拥有信号量谁拥有执行权,在freeRTOS中信号量和互斥量有点不同,关于信号量的更多描述可以参考官网相关网页描述。每一个信号量都需要少量的内存来保持信号量的状态,那么这内存是如何分配的呢,这根据使用的API函数会有所不同,创建信号量主要有xSemaphoreCreateBinary()和xSemaphoreCreateBinaryStatic() ,使用前者创建信号量,则所需的内存将会自动从freeRTOS的堆上
用户1605515
2018/04/10
1.2K0
STM32-FreeRTOS快速学习之总结1
1. 基础知识 注意:在RTOS中是优先值越高则优先级越高(和ucos/linux的相反) 在移植的时候,主要裁剪FreeRTOS/Source/portable文件夹,该文件夹用来针对不同MCU做的一些处理,如下图所示,我们只需要使用:
诺谦
2019/05/24
1.5K0
基于STM32和FreeRTOS的二值信号量实现任务同步
在嵌入式开发中,只要你使用实时操作系统,那么使用信号量可以说必不可少。我们常使用信号量进行同步或互斥。
跋扈洋
2022/12/03
1.2K0
基于STM32和FreeRTOS的二值信号量实现任务同步
FreeRTOS | 任务管理(第十四天)
注意,若configSUPPORT_STATIC_ALLOCATION有效了,需要为系统的空闲任务和定时器任务提供独立的内存空间,详细添加的代码如下:
Qt历险记
2024/10/27
2650
FreeRTOS | 任务管理(第十四天)
韦东山freeRTOS系列教程之【第十一章】中断管理(Interrupt Management)
在RTOS中,需要应对各类事件。这些事件很多时候是通过硬件中断产生,怎么处理中断呢?
韦东山
2021/12/08
2.7K0
韦东山freeRTOS系列教程之【第十一章】中断管理(Interrupt Management)
FreeRTOS | 内核控制函数和时间管理(第十四天)
Qt历险记
2024/10/30
2460
FreeRTOS | 内核控制函数和时间管理(第十四天)
使用FreeRTOS要好好理解任务状态机
前面一文利用FreeRTOS点灯,算是将FreeRTOS给跑起来了,要用好RTOS,从黑盒角度去理解一下调度器是怎么工作的是很必要的,当然如果想研究其内部实现原理,可以去读其内部实现代码,但是个人感觉如果是从用的角度,把内核看成黑盒,跳出来梳理一下概念也很有用。
wenzid
2021/08/13
1.3K0
使用FreeRTOS要好好理解任务状态机
深入探索嵌入式开发中的 FreeRTOS:从入门到精通
在嵌入式系统的广阔天地里,实时操作系统(RTOS)正扮演着愈发关键的角色。FreeRTOS作为一款开源、轻量级且功能卓越的实时操作系统,备受全球开发者的青睐。它为嵌入式开发带来了高效的多任务管理、精准的资源调度等诸多优势,极大地提升了开发效率与系统的可靠性。接下来,让我们一同踏上从入门到深入掌握FreeRTOS的精彩旅程。听说先赞后看,就能家财万贯。
威哥爱编程
2025/02/28
5370
FreeRTOS | STM32F407 FreeRTOS移植(第十四天)
【超级会员V1】通过百度网盘分享的文件:FreeRTOS 链接:https://pan.baidu.com/s/1MaoISeHM4M68gN3LQUOHaA?pwd=68Hh 提取码:68Hh 复制这段内容打开「百度网盘APP 即可获取」
Qt历险记
2024/10/20
3870
FreeRTOS | STM32F407 FreeRTOS移植(第十四天)
FreeRTOS(十三):信号量
信号量是操作系统中重要的一部分,信号量一般用来进行资源管理和任务同步,FreeRTOS 中信号量又分为二值信号量、计数型信号量、互斥信号量和递归互斥信号量。
Jasonangel
2022/02/17
1.2K0
FreeRTOS(十三):信号量
FreeRTOS 消息队列
上面这几中方式中, 除了消息通知, 其他几种实现都是基于消息队列。消息队列作为主要的通信方式, 支持在任务间, 任务和中断间传递消息内容。 这一章介绍 FreeRtos 消息队列的基本使用, 重点分析其实现的方式。
orientlu
2018/09/13
2.5K0
FreeRTOS 消息队列
学习计数型信号量的使用方法
实验设计:主函数中创建一个计数型信号量,计数值为10,初始化计数值为0,然后创建两个任务,任务task00释放信号量,任务task01获取信号量。
用户8671053
2021/10/06
4450
FreeRTOS源码探析之——消息队列
创建消息队列时FreeRTOS会先给消息队列分配一块内存空间,这块内存的大小等于消息队列控制块大小加上(单个消息空间大小与消息队列长度的乘积),接着再初始化消息队列,此时消息队列为空。
xxpcb
2021/01/28
1K0
FreeRTOS源码探析之——消息队列
Semaphore信号量
Semaphore是用来保护一个或者多个共享资源的访问,Semaphore内部维护了一个计数器,其值为可以访问的共享资源的个数。一个线程要访问共享资源,先获得信号量,如果信号量的计数器值大于1,意味着有共享资源可以访问,则使其计数器值减去1,再访问共享资源。
暴躁的程序猿
2022/03/23
2840
Semaphore信号量
使用二值信号量完成任务间的同步
实验设计:任务task00定时释放二值信号量,任务task01获取二值信号量,接收到信号量就进行相应的动作。
用户8671053
2021/10/06
4380
相关推荐
FreeRTOS 信号量
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验