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

defer那些事儿

defer 的参数求值

package main
import "fmt"
func main() {    for i := 0; i < 3; i++ {        defer fmt.Println(i)    }}
210

defer 的调用被加入到一个栈中,按照后进先出(LIFO)的顺序执行。

  • defer 参数的求值时机

    在 defer 被声明时,fmt.Println(i) 的参数 i 的值会立即求值并保存下来,与循环结束后变量 i 的最终值无关。

  • 执行顺序

文件或资源泄漏

package main
import (    "os")
func main() {    file, _ := os.Open("nonexistent.txt") // 假设文件不存在    defer file.Close() // 如果 file 是 nil,程序会崩溃}

多个 defer 顺序

package main
import "fmt"
func main() {    defer fmt.Println("First")    defer fmt.Println("Second")    defer fmt.Println("Third")}

确保 defer 的顺序符合需求,或者通过显式控制逻辑避免依赖 defer 顺序。

闭包变量捕获问题

package main
import "fmt"
func main() {    for i := 0; i < 3; i++ {        defer func() { fmt.Println(i) }() // 闭包捕获了循环变量 i    }}
333

    闭包捕获的是变量 i 的引用,而不是每次循环时的值。循环结束后,i 的值是 3,因此所有 defer 使用的都是这个最终值


http://www.kler.cn/a/429092.html

相关文章:

  • 无人机(Unmanned Aerial Vehicle, UAV)路径规划介绍
  • Social LSTM:Human Trajectory Prediction in Crowded Spaces | 文献翻译
  • 软考高级5个资格、中级常考4个资格简介及难易程度排序
  • Navicat 17 功能简介 | 商业智能 BI
  • 【王树森搜索引擎技术】概要01:搜索引擎的基本概念
  • LDD3学习7--硬件接口I/O端口(以short为例)
  • python 清华pip镜像源报HTTP error 403
  • JavaSE——泛型编程
  • 运输层6——TCP流量控制
  • LDR6500:音频双C支持,数字与模拟的完美结合
  • Mac通过Windows App远程访问windows电脑报错0x104的解决办法
  • iPhone怎么一键删除照片:快速清理存储空间
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.18——内存函数
  • Python的3D可视化库vedo 1-3 (visual模块)网格对象的线和面、图片的属性
  • 【Python】批量下载抖音视频
  • 通过ThinkPad小红点键盘左右滑动页面
  • OpenCV 图像变换与处理实战
  • 2.Flink的项目初始化和Hello-world
  • 「Mac玩转仓颉内测版47」小学奥数篇10 - 数列求和
  • 电脑无法识别usb设备怎么办?电脑无法识别usb解决方法
  • 基于STM32的DS18B20温度报警器_可调上下限Proteus仿真设计(仿真+程序+设计报告+讲解视频)
  • 鸿蒙ZRouter动态路由框架—服务路由
  • java+springboot+mysql游乐园管理系统
  • 重生之我在学Vue-- Vue3 学习路径总览
  • 生成SSH秘钥文件
  • Python实现ARIMA-LSTM回归模型预测股票价格项目实战