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

go语言中defer用法详解

defer 是 Go 语言中的一个关键字,用于延迟执行某个函数或语句,直到包含它的函数返回时才执行。defer 语句在函数执行结束后(无论是正常返回还是由于 panic 返回)都将执行。

defer 的基本用法

  1. 延迟执行: 当你在一个函数内调用 defer 语句,后面的语句将被推迟到该函数执行结束时执行。

    package mainimport "fmt"func main() {defer fmt.Println("这是最后执行的语句")fmt.Println("这是先执行的语句")
    }
    

    输出:

    这是先执行的语句
    这是最后执行的语句
    
  2. 多个 defer 语句: 如果一个函数中有多个 defer 语句,它们会按照后进先出(LIFO)的顺序执行。

    package mainimport "fmt"func main() {defer fmt.Println("第一个 defer")defer fmt.Println("第二个 defer")defer fmt.Println("第三个 defer")fmt.Println("主函数中的代码")
    }
    

    输出:

    主函数中的代码
    第三个 defer
    第二个 defer
    第一个 defer
    

  3. 传递参数: 在 defer 语句中传递参数时,参数在 defer 被调用时就会被评估,而不是在执行时。

    package mainimport "fmt"func main() {for i := 0; i < 3; i++ {defer fmt.Println(i) // 这里的 i 会被延迟执行}
    }
    

    输出:

    2
    1
    0
    

    如果在 defer 语句中直接使用 i 的值而不是它的引用,结果会是这样的。

defer 的常见用途

  1. 资源清理defer 常用于释放资源,如关闭文件、数据库连接等。这样可以确保即使在函数中发生错误时,资源仍然能被正确释放。

    package mainimport ("fmt""os"
    )func main() {file, err := os.Open("example.txt")if err != nil {fmt.Println("打开文件错误:", err)return}defer file.Close() // 确保文件在函数结束时被关闭// 处理文件...
    }
    

  2. 错误处理: 结合 recover 使用,可以处理 panic 并进行错误处理。

    package mainimport "fmt"func recoverFromPanic() {defer func() {if r := recover(); r != nil {fmt.Println("捕获到 panic:", r)}}()panic("发生了错误") // 触发 panic
    }func main() {recoverFromPanic()fmt.Println("程序继续运行")
    }
    

  3. 函数执行时间测量: 可以使用 defer 来测量函数执行时间。

    package mainimport ("fmt""time"
    )func main() {start := time.Now()defer func() {fmt.Println("函数执行时间:", time.Since(start))}()// 模拟耗时操作time.Sleep(2 * time.Second)
    }
    

总结

defer 是 Go 语言中一个强大且灵活的工具,适用于资源管理、错误处理和其他需要在函数返回时执

相关文章:

go语言中defer用法详解

defer 是 Go 语言中的一个关键字&#xff0c;用于延迟执行某个函数或语句&#xff0c;直到包含它的函数返回时才执行。defer 语句在函数执行结束后&#xff08;无论是正常返回还是由于 panic 返回&#xff09;都将执行。 defer 的基本用法 延迟执行&#xff1a; 当你在一个函数…...

iOS 18.2开发者预览版 Beta 1版本发布,欧盟允许卸载应用商店

苹果今天为开发人员推送了iOS 18.2开发者预览版 Beta 1版本 更新&#xff08;内部版本号&#xff1a;22C5109p&#xff09;&#xff0c;本次更新距离上次发布 Beta / RC 间隔 2 天。该版本仅适用于支持Apple Intelligence的设备&#xff0c;包括iPhone 15 Pro系列和iPhone 16系…...

【SQL】SQL函数

&#x1f4e2; 前言 函数 是指一段可以直接被另一段程序调用的程序或代码。主要包括了以下4中类型的函数。 字符串函数数值函数日期函数流程函数 &#x1f384; 字符串函数 ⭐ 常用函数 函数 功能 CONCAT(S1,S2,...Sn) 字符串拼接&#xff0c;将S1&#xff0c;S2&#xff0…...

NSSCTF刷题篇web部分

源码泄露 [FSCTF 2023]寻找蛛丝马迹 这个源码泄露&#xff0c;可以记录一下&#xff0c;涉及的知识点比较多 打开环境 查看源码&#xff0c; 第一段flag 乱码&#xff0c;恢复一下 乱码恢复网站&#xff1a;乱码恢复 (mytju.com) 剩下的就只说方法 http://node4.anna.nss…...

超子物联网HAL库笔记:准备篇

超子物联网 HAL库学习 汇总入口&#xff1a; 超子物联网HAL库笔记&#xff1a;[汇总] 写作不易&#xff0c;如果您觉得写的不错&#xff0c;欢迎给博主来一波点赞、收藏~让博主更有动力吧&#xff01; 1. HAL库简介 HAL库 HAL库&#xff08;Hardware Abstraction Layer&#…...

FoRAG:面向网络增强型长文本问答的事实优化检索增强生成方法

人工智能咨询培训老师叶梓 转载标明出处 检索增强生成技术尽管出现了各种开源方法和商业系统&#xff0c;如Bing Chat&#xff0c;但生成的长文本答案中缺乏事实性和清晰逻辑的问题仍未得到解决。为了解决这些问题&#xff0c;来自蚂蚁集团和清华大学的研究者们提出了一种名为…...

Android NSD局域网发现服务

近期在了解局域网发现服务的时候无意间看到Android 自带的&#xff08;Network Service Discovery&#xff09;网络发现服务&#xff0c;在一番验证之后发现实现比较简单&#xff0c;可靠性也高&#xff0c;因此在这里做一个整理&#xff0c;算是对自己知识做一个归档。 网络服…...

算法的学习笔记—左旋转字符串(牛客JZ58)

&#x1f600;前言 在程序设计中&#xff0c;字符串处理问题屡见不鲜&#xff0c;其中“字符串左旋”是一种常见操作&#xff0c;今天我们一起来探讨一个经典的左旋转字符串题目&#xff0c;以及一种优雅的解决方案——三步翻转法。 &#x1f3e0;个人主页&#xff1a;尘觉主页…...

Mac 上无法烧录 ESP32C3 的问题记录:A fatal error occurred:Failed to write to target RAM

文章目录 问题描述驱动下载地址问题解决&#xff1a;安装 CH343 驱动踩的坑日志是乱码 问题描述 我代码编译可以&#xff0c;但是就是烧录不上去 A fatal error occurred:Failed to write to target RAM(result was 01070000:Operation timed out) Uploaderror:上传失败&…...

ios 项目升级极光SDK

由于项目使用的是旧版本&#xff0c;隐私合规检查不通过&#xff0c;需要升级到最新版本&#xff0c; 使用cocoapods集成无法正常运行&#xff0c;.a文件找不到&#xff0c;可能项目比较久了&#xff0c;最好选择手动导入 下载最新版本SDK&#xff0c;将 SDK 包解压&#xff…...

【Java】java | logback日志配置 | 按包配置级别

一、概述 日志配置需求&#xff1a; 本地部分包开debug&#xff0c;其他路径走配置&#xff1b;只在本地环境有效 二、logback.xml配置 <!--本地调试&#xff0c;开debug--> <springProfile name"dev"><logger name"cn.hg.demo" level&quo…...

Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后&#xff0c;在原理图界面点击Launch&#xff0c;点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找打Generate All from Source。 2、在Generate Layout界面&#xff0c;选中“Instance”&#…...

Spring框架原理面试题及参考答案

目录 什么是Spring 开发框架? 说说Spring 的 IOC 和 DI? 简述IoC(控制反转)及在 Spring 中的实现 说说Spring IOC 容器的基本概念? 说说Spring IoC 的实现机制? 说说Spring IoC 容器? 简述Spring ApplicationContext 说说Spring Bean 的生命周期 说说在 Spring…...

Java类的static成员以及代码块(详细版)

文章目录 一、什么是static成员二、static修饰的成员有何意义三、static修饰成员变量四、static修饰成员方法4.1、静态成员变量不可以在方法内创建4.2、静态成员方法内部不可以访问非静态成员变量4.3、总结 五、static成员变量的初始化5.1、就地初始化5.2、静态代码块初始化 六…...

Opensearch集群部署【docker、服务器、Helm多种部署方式】

操作系统兼容性 我们建议在 Red Hat Enterprise Linux (RHEL) 或使用systemd的基于 Debian 的 Linux 发行版上安装 OpenSearch &#xff0c;例如 CentOS、Amazon Linux 2 和 Ubuntu Long-Term Support (LTS)。OpenSearch 应该适用于大多数 Linux 发行版&#xff0c;但我们只测…...

本地Docker部署开源WAF雷池并实现异地远程登录管理界面

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

性能需求笔记

名称解释 系统用户&#xff1a;所有注册过的用户&#xff1b;在线用户&#xff1a;某时间段内登录且在线的用户 pv&#xff1a;用户浏览页面的次数 UV&#xff1a;登录系统的用户&#xff0c;uv课产生多个pv 性能测试&#xff1a;测试软件在系统中的运行性能&#xff0c;度量系…...

ts:数组的常用方法(reduce累加)

ts&#xff1a;数组的常用方法&#xff08;reduce累加&#xff09; 一、主要内容说明二、例子reduce方法&#xff08;累加&#xff09;1.源码1 &#xff08;reduce方法&#xff09;2.源码1运行效果 三、结语四、定位日期 一、主要内容说明 ts中数组的reduce方法&#xff0c;用…...

Begin

cpp 编程的发展方向还是很多的&#xff1a;游戏、嵌入式、QT、客户端、服务端、机器学习、算法大模 型 ...&#xff0c;现阶段还是不太清楚具体想走什么方向。主QT编程应该是不在考虑之内的&#xff0c;可以为辅简单 学习一下&#xff1b;游戏方向&#xff1a;需要学习lua语言…...

【实战案例】Django框架表单处理及数据库交互

本文基于之前内容列表如下&#xff1a; 【图文指引】5分钟搭建Django轻量级框架服务 【实战案例】Django框架基础之上编写第一个Django应用之基本请求和响应 【实战案例】Django框架连接并操作数据库MySQL相关API 【实战案例】Django框架使用模板渲染视图页面及异常处理 更新编…...

FreeRTOS在RISC-V上的第一个main.c:从创建任务到理解Hook函数的完整流程

FreeRTOS在RISC-V上的第一个main.c&#xff1a;从创建任务到理解Hook函数的完整流程 当你在RISC-V平台上第一次打开main.c文件准备编写FreeRTOS应用时&#xff0c;可能会被那些看似神秘的函数和配置选项所困扰。这篇文章将带你从零开始&#xff0c;逐步构建一个完整的FreeRTOS应…...

高级技巧:利用SharpShooter实现COM Staging和应用程序白名单绕过

高级技巧&#xff1a;利用SharpShooter实现COM Staging和应用程序白名单绕过 【免费下载链接】SharpShooter Payload Generation Framework 项目地址: https://gitcode.com/gh_mirrors/sh/SharpShooter SharpShooter 是一款功能强大的Payload生成框架&#xff0c;专为安…...

CSS Zen Garden设计趋势分析:过去20年的网页设计演变完全指南

CSS Zen Garden设计趋势分析&#xff1a;过去20年的网页设计演变完全指南 【免费下载链接】csszengarden.com The source of csszengarden.com 项目地址: https://gitcode.com/gh_mirrors/cs/csszengarden.com CSS Zen Garden作为网页设计领域的标志性项目&#xff0c;展…...

reverse-shell在企业安全测试中的最佳实践:风险评估与合规使用

reverse-shell在企业安全测试中的最佳实践&#xff1a;风险评估与合规使用 【免费下载链接】reverse-shell Reverse Shell as a Service 项目地址: https://gitcode.com/gh_mirrors/re/reverse-shell reverse-shell作为一款开源的"Reverse Shell as a Service"…...

60.人工智能实战:大模型 SLO 怎么制定?从“感觉系统还行”到可量化的质量、延迟、成本与安全指标

人工智能实战:大模型 SLO 怎么制定?从“感觉系统还行”到可量化的质量、延迟、成本与安全指标 一、问题场景:业务问系统稳不稳定,团队只能说“还可以” 大模型系统上线后,业务方经常会问: 现在系统稳定吗? 效果有没有变好? 成本是否可控? 用户体验怎么样?如果团队只…...

工程师视角:从生物钟原理到实战,系统化解决跨时区时差问题

1. 时差反应的本质与挑战&#xff1a;为什么我们会被“时差”困扰&#xff1f;作为一名常年需要跨时区协作的硬件工程师&#xff0c;我对“时差”这个词有着切肤之痛。无论是为了一个紧急的客户会议飞往硅谷&#xff0c;还是参加一年一度的慕尼黑电子展&#xff0c;跨越多个时区…...

ARM TLB失效指令原理与应用实践

1. ARM TLB失效指令深度解析在ARM架构中&#xff0c;TLB&#xff08;Translation Lookaside Buffer&#xff09;作为内存管理单元&#xff08;MMU&#xff09;的关键组件&#xff0c;负责缓存虚拟地址到物理地址的转换结果。当操作系统修改页表或进行上下文切换时&#xff0c;必…...

AI大模型选型生死线(2026企业采购决策白皮书):API延迟、幻觉率、合规审计通过率三维淘汰制解析

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI大模型选型生死线&#xff1a;2026企业采购决策范式重构 当算力成本下降47%、推理延迟压缩至83ms、私有化微调周期缩短至4.2小时&#xff0c;企业不再比拼“谁用了大模型”&#xff0c;而是在验证“谁…...

ChatGPT 2023年3月14日更新解读:GPT-4接入Plus,正式进入GPT-4时代

&#x1f525;个人主页&#xff1a;杨利杰YJlio❄️个人专栏&#xff1a;《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》 《那些年未解决的Windows疑难杂症》&#x1f31f; 让复杂的事情更…...

本地化部署AI做表格工具评测:数以轻舟Agent技术架构与落地实践

一、产品定位与核心架构数以轻舟Agent是一款面向Excel数据处理场景的垂直型AI智能体&#xff0c;由北京乾策数智科技有限公司开发&#xff0c;2025年12月推出首款产品&#xff0c;2026年5月正式上线本地化部署版本。产品核心定位并非通用AI助手&#xff0c;而是聚焦"AI做表…...