码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Go 语言中 defer 使用时有哪些陷阱?


    大家好,我是 frank ,「 Golang 语言开发栈」公众号作者。

    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 语句时,还遇到过哪些陷阱?

  • 相关阅读:
    显示支付结果_前端轮询_解决方案1
    Golang中的文件操作
    使用Tesseract-OCR对PDF等图片文件进行文字识别
    【一】【SQL】表的增删查改(部分)
    通过DataEase行列权限设置实现数据权限管控
    我要写整个中文互联网界最牛逼的JVM系列教程 | 「类加载子系统」章节:类的加载过程之三:Initialization
    模型训练中的常见超参数解析
    安卓手机微信收不到消息提醒,这样设置就能轻松解决
    安泰线束测试仪科普:影响线束电阻值的因素有哪些
    菜鸟教程《Python 3 教程》笔记(15):数据结构
  • 原文地址:https://www.cnblogs.com/frank-/p/17977592
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号