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

Go语言 Defer(延迟)

 本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。

目录

定义

应用场景

代码示例

改为匿名函数

总结


定义

延迟:关键字,可以用于修饰语句、函数,

确保这条语句可以在当前栈退出的时候执行。

应用场景

1.一般用于做资源清理工作

2.解锁、关闭文件

3.在同一个函数中多次调用defer,执行时类似于栈的机制:先后入后出

代码示例

创建文件读取函数,并设置读取的文件路径为当前路径下的for循环文件。

Defer函数可以保证文件关闭一定会被执行,不管自定义的函数出现异常还是错误。

示例如下:

package mainimport ("fmt""os"
)func main() {filename := "for循环.go"readFile(filename)
}func readFile(filename string) {// func Open(name string) (*File, error) {}// 1.go语言一般会将错误码作为最后一个参数返回// 2.err一般nil代表没有错误,执行成功,非nil表示执行失败f1, err := os.Open(filename)defer f1.Close()if err != nil {fmt.Println("os.Open(", filename, ") ==> 打开文件失败,err:", err)return}buf := make([]byte, 1024)// func (f *File) Read(b []byte) (n int, err error)n, _ := f1.Read(buf)fmt.Println("读取文件的实际长度:", n)fmt.Println("读取文件的内容:", string(buf))
}

运行结果:

 

改为匿名函数

匿名函数,没有名字,属于一次性的逻辑类似于lamada表达式。

把defer的处理改为创建匿名函数,同时调用。

在一个方法或者函数中,可以有多个defer语句,

多个defer语句的执行顺序依照后进先出的原则。

示例如下:

package mainimport ("fmt""os"
)func main() {filename := "for循环.go"readFile(filename)
}func readFile(filename string) {// func Open(name string) (*File, error) {}// 1.go语言一般会将错误码作为最后一个参数返回// 2.err一般nil代表没有错误,执行成功,非nil表示执行失败f1, err := os.Open(filename)// defer f1.Close()defer func(a int) {fmt.Println("准备关闭文件, code:", a)_ = f1.Close()}(100) // 创建一个匿名函数,同时调用if err != nil {fmt.Println("os.Open(", filename, ") ==> 打开文件失败,err:", err)return}defer fmt.Println("倒计时1")defer fmt.Println("倒计时2")defer fmt.Println("倒计时3")buf := make([]byte, 1024)// func (f *File) Read(b []byte) (n int, err error)n, _ := f1.Read(buf)fmt.Println("读取文件的实际长度:", n)fmt.Println("读取文件的内容:", string(buf))
}

运行结果:

总结

本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Flutter-->AAPT: error: resource android:attr/lStar not found.
  • 安卓中Room持久化库的使用
  • 哈希 | Java | (hot100) 力扣 49
  • 重头开始嵌入式第十九天(Linux系统编程 文件IO)
  • Android-->产物收集(含apk文件重命名, aab文件重命名)
  • Mutual_Voting_for_Ranking_3D_Correspondences
  • AFSim 仿真系统----坐标系统
  • 基于CNN的医学X-Ray图像分类全程解析
  • 在Notebook中使用backtrader绘图出现 Javascript Error: IPython is not defined
  • CUDA编程06 - 性能优化指南
  • 【微信小程序】WXSS 模板样式
  • 详解C++的四大特性(封装,继承,多态,抽象)
  • 大数据信用报告查询哪家平台的比较好?
  • 视频美颜SDK的核心技术与直播美颜插件的开发详解
  • 国内首个支持国产化信创的开源云原生平台
  • 网络传输文件的问题
  • Google 是如何开发 Web 框架的
  • MySQL-事务管理(基础)
  • PHP的类修饰符与访问修饰符
  • RxJS: 简单入门
  • Selenium实战教程系列(二)---元素定位
  • Swoft 源码剖析 - 代码自动更新机制
  • Yii源码解读-服务定位器(Service Locator)
  • 简单数学运算程序(不定期更新)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 力扣(LeetCode)56
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 如何解决微信端直接跳WAP端
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 听说你叫Java(二)–Servlet请求
  • 新版博客前端前瞻
  • 用Visual Studio开发以太坊智能合约
  • 怎么把视频里的音乐提取出来
  • 最近的计划
  • ionic入门之数据绑定显示-1
  • ​ubuntu下安装kvm虚拟机
  • ######## golang各章节终篇索引 ########
  • #、%和$符号在OGNL表达式中经常出现
  • (2)空速传感器
  • (4)(4.6) Triducer
  • (4)事件处理——(7)简单事件(Simple events)
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (WSI分类)WSI分类文献小综述 2024
  • (创新)基于VMD-CNN-BiLSTM的电力负荷预测—代码+数据
  • (代码示例)使用setTimeout来延迟加载JS脚本文件
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (九)信息融合方式简介
  • (七)glDrawArry绘制
  • (三十五)大数据实战——Superset可视化平台搭建
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十三)Flask之特殊装饰器详解
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • .net CHARTING图表控件下载地址
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布