当前位置: 首页 > news >正文

golang的defer

文章目录

    • 把 defer 想象成"临时便签"
    • 用生活例子理解:
    • 更直观的对比:
      • **没有 defer 的代码:**
      • **有 defer 的代码:**
    • 执行时机的详细说明:
    • 关键理解点:
    • 用计时器例子:

把 defer 想象成"临时便签"

当你写 defer 时,Go 会把这个函数调用写在一张"便签"上,等到当前函数结束时,再执行这些便签上的内容。

用生活例子理解:

func 回家() {fmt.Println("1. 进门")defer fmt.Println("4. 关灯")     // 便签1:记住要关灯defer fmt.Println("3. 锁门")     // 便签2:记住要锁门fmt.Println("2. 吃饭、看电视...")// 函数结束时,Go会按照便签执行:// 先执行便签2(锁门)// 再执行便签1(关灯)
}

输出顺序:

1. 进门
2. 吃饭、看电视...
3. 锁门
4. 关灯

更直观的对比:

没有 defer 的代码:

func openFile() {file, _ := os.Open("test.txt")// 做一些操作...if 某个条件 {file.Close()  // 要记得关闭文件return}// 做更多操作...if 另一个条件 {file.Close()  // 又要记得关闭文件return}file.Close()  // 还要记得关闭文件
}

有 defer 的代码:

func openFile() {file, _ := os.Open("test.txt")defer file.Close()  // 一次性"预约"关闭操作// 做一些操作...if 某个条件 {return  // 文件会自动关闭}// 做更多操作...if 另一个条件 {return  // 文件会自动关闭}// 函数结束,文件会自动关闭
}

执行时机的详细说明:

func example() {fmt.Println("开始")defer fmt.Println("我是defer 1")defer fmt.Println("我是defer 2")fmt.Println("中间")if true {fmt.Println("条件执行")return  // 函数在这里返回}fmt.Println("这行不会执行")
}

执行顺序:

  1. fmt.Println("开始")
  2. 遇到 defer fmt.Println("我是defer 1") → 记在便签上
  3. 遇到 defer fmt.Println("我是defer 2") → 记在便签上
  4. fmt.Println("中间")
  5. fmt.Println("条件执行")
  6. return函数要结束了,执行便签!
  7. 执行便签2:fmt.Println("我是defer 2")
  8. 执行便签1:fmt.Println("我是defer 1")

输出:

开始
中间
条件执行
我是defer 2
我是defer 1

关键理解点:

  1. “包含它的函数” = 写 defer 的那个函数
  2. “返回之前” = 函数结束的那一刻,但还没有真正返回给调用者
  3. 无论怎么退出 = 正常return、panic、到达函数末尾,defer都会执行

用计时器例子:

func 做作业() {fmt.Println("开始做作业")defer fmt.Println("收拾桌子")  // 便签:记住要收拾桌子fmt.Println("做数学题")fmt.Println("做语文题")// 函数结束时,自动执行:收拾桌子
}

这样理解了吗?defer 就像是在函数里贴便签,提醒自己在离开前要做什么事情!

http://www.lryc.cn/news/581515.html

相关文章:

  • JAX study notes[15]
  • 百度文心大模型 4.5 开源深度测评:技术架构、部署实战与生态协同全解析
  • 前端环境nvm/pnpm下载配置
  • 在C#中,可以不实例化一个类而直接调用其静态字段
  • 【Elasticsearch入门到落地】15、DSL排序、分页及高亮
  • 【HarmonyOS】鸿蒙应用开发Text控件常见错误
  • 深入解析Vue中v-model的双向绑定实现原理
  • D3 面试题100道之(61-80)
  • Qt实现外网双向音视频通话/支持嵌入式板子/实时性好延迟低/可以加水印
  • C++基础复习笔记
  • 【网络系列】HTTP 429 状态码
  • Debezium日常分享系列之:认识Debezium Operator
  • Go语言实现双Token登录的思路与实现
  • UNIX程序设计基本概念和术语
  • 玄机——第一章日志分析-mysql应急响应
  • docker 无法拉取镜像解决方法
  • 系统架构设计师论文分享-论软件体系结构的演化
  • Apache Iceberg数据湖基础
  • 极简的神经网络反向传播例子
  • 探寻《答案之书》:在随机中寻找生活的指引
  • 5种高效解决Maven依赖冲突的方法
  • Golang读取ZIP压缩包并显示Gin静态html网站
  • c++对象池
  • 数据库|达梦DM数据库安装步骤
  • [论文阅读] 人工智能 + 软件工程 | 自然语言驱动结构代码搜索:突破DSL学习壁垒的创新方法
  • 分布式压测
  • python高级变量XIII
  • jenkins安装
  • 分布式事务解决方案(二)
  • 探索实现C++ STL容器适配器:优先队列priority_queue