【golang学习之旅】延迟调用——defer

系列文章

【golang学习之旅】使用VScode安装配置Go开发环境
【golang学习之旅】报错:a declared but not used
【golang学习之旅】Go 的基本数据类型
【golang学习之旅】深入理解字符串string数据类型
【golang学习之旅】go mod tidy
【golang学习之旅】记录一次 panic case : reflect: reflect.Value.SetInt using unaddressable value
【golang学习之旅】记录一次 error case : full error output: cc1: error: unrecognized command line option
【golang学习之旅】Go程序快速开始 & Go程序开发的基本注意事项
【golang学习之旅】Go语言常用转义字符
【golang学习之旅】Go中的变量(1)
【golang学习之旅】Go中的变量——基本数据类型(1)
【golang学习之旅】Go中的变量——基本数据类型(2)
【golang学习之旅】复杂数据类型——指针 & 函数


  • 系列文章
  • defer特性
  • defer用途
  • defer使用
  • 最佳实践


defer特性

  1. 关键字 defer 用于注册延迟调用。
  2. 这些调用直到 return 前才被执。因此,可以用来做资源清理。
  3. 多个defer语句,按先进后出的方式执行。
  4. 每次defer语句执行时,会先计算出函数值和入参并保持起来;即,在执行defer语句时,延迟函数的入参已经确定,并保存了副本。

defer用途

及时释放资源。比如:

  1. 关闭文件句柄
  2. 锁资源释放
  3. 数据库连接释放

defer使用

defer 是先进后出的。

后面的语句会依赖前面的资源,因此如果先前面的资源先释放了,后面的语句就没法执行了

package mainimport "fmt"func deferTest() {defer fmt.Println("defer1")defer fmt.Println("defer2")fmt.Println("deferTest...")
}
func main() {deferTest()defer fmt.Println("defer3")
}输出:
deferTest...
defer2
defer1
defer3
  • 当代码执行到defer时,暂时不会执行defer后的语句,而是将语句压入独立的栈(defer栈)。当函数执行完毕后,在从defer栈按照先进后出的方式执行

注意:

在defer将语句放入栈时,也会将相关的值拷贝同时入栈,这和函数调用是一样的。

package mainimport "fmt"func deferTest() {n1 := 1n2 := 2defer fmt.Println("defer1 n1=", n1, "n2=", n2)n1++n2++defer fmt.Println("defer2 n1=", n1, "n2=", n2)n1++n2++fmt.Println("deferTest... n1=", n1, "n2=", n2)
}
func main() {deferTest()defer fmt.Println("defer3")
}输出:
deferTest... n1= 3 n2= 4
defer2 n1= 2 n2= 3
defer1 n1= 1 n2= 2
defer3

最佳实践

在函数执行完毕后,可以及时地释放函数创建的资源,该操作不需要写在代码末尾(很容易忘记这个步骤),直接写在创建资源代码后面。

这种机制让程序员不再为什么时机关闭资源而烦恼

// 在打开文件资源后立即defer关闭文件资源,当然关闭操作会在程序退出时执行file := openFile(文件名)defer file.Close()//其他代码// 在连接数据库后立即defer释放数据库资源,当然关闭操作会在程序退出时执行connect = connectDB(dbName)defer connect.Close()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/860662.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【阅读论文】-- IDmvis:面向1型糖尿病治疗决策支持的时序事件序列可视化

IDMVis: Temporal Event Sequence Visualization for Type 1 Diabetes Treatment Decision Support 摘要1 引言2 1 型糖尿病的背景3 相关工作3.1 时间事件序列可视化3.2 电子健康记录可视化3.3 1 型糖尿病可视化3.4 任务分析与抽象 4 数据抽象5 层次化任务抽象5.1 临床医生工作…

绘制全球各大洲典型流域的时间序列图

流量世界第一、长度第二的亚马逊流域(Amazon)、南美洲第四大、整条河流位于巴西的圣弗朗西斯科流域(Sao Francisco)、世界第四长、北美洲最长的密西西比流域(Mississippi)、欧洲最长的伏尔加流域&#xff0…

小程序简单版音乐播放器

小程序简单版音乐播放器 结构 先来看看页面结构 <!-- wxml --><!-- 标签页标题 --> <view class"tab"><view class"tab-item {{tab0?active:}}" bindtap"changeItem" data-item"0">音乐推荐</view><…

SAP ABAP 之容器

文章目录 前言一、案例介绍/笔者需求二、自定义容器 a.实例化对象 b.自定义容器效果演示 c.Copy Code 三、自适应容器 a.常用 必须 参数理解 b.METRIC 度量单位 c.RATIO 百分比尺寸 d.STYLE 容器…

springboot网上商城系统-计算机毕业设计源码08789

摘 要 随着互联网趋势的到来&#xff0c;各行各业都在考虑利用互联网将自己推广出去&#xff0c;最好方式就是建立自己的互联网系统&#xff0c;并对其进行维护和管理。在现实运用中&#xff0c;应用软件的工作规则和开发步骤&#xff0c;采用Java技术建设网上商城系统。 本设…

MUR6060PT-ASEMI逆变焊机MUR6060PT

编辑&#xff1a;ll MUR6060PT-ASEMI逆变焊机MUR6060PT 型号&#xff1a;MUR6060PT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-247 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;60A 最大循环峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;600V 最大…

C++:C与C++混合编程

混合编程 为什么需要混合编程 (1)C有很多优秀成熟项目和库&#xff0c;丢了可惜&#xff0c;重写没必要&#xff0c;C程序里要调用 (2)庞大项目划分后一部分适合用C&#xff0c;一部分适合用C (3)其他情况&#xff0c;如项目组一部分人习惯用C&#xff0c;一部分习惯用C 为什么…

echarts隔行背景色

看了下使用说明&#xff0c;试了半天终于搞对了 参考文档&#xff1a;Documentation - Apache ECharts option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [120, 200, 150, 80, 70, 110, 130],type: bar,mar…

探索PostgreSQL存储过程:效率与强大的结合体

探索PostgreSQL存储过程&#xff1a;效率与强大的结合体 引言 PostgreSQL&#xff0c;作为功能强大的开源对象关系数据库系统&#xff0c;提供了丰富的数据库编程功能。存储过程是PostgreSQL中的一项重要特性&#xff0c;它允许封装一系列SQL语句和控制流语句为一个单一的操作…

IP地址在市场数据分析中的帮助

在当今数字化时代&#xff0c;市场数据分析对于企业的成功至关重要。而在这个过程中&#xff0c;IP地址作为一个关键的数据点&#xff0c;为市场分析师提供了宝贵的洞察和指引。以下将详细探讨IP地址在市场数据分析中的具体作用。 一、用户地理定位 IP地址可以帮助分析师确定…

【实用软件】Internet Download Manager(IDM6.41)下载及安装教程

​数据表明但是能够通过搭配下载的方式来使用IDM&#xff08;比如用迅雷离线下载&#xff0c;115离线&#xff0c;百度网盘等离线下载好的资源&#xff0c;然后结合HTTP协议的特性再用IDM下载&#xff09;能够达到事半功倍的效果。有目共睹的是IDM下载HTTP链接十分快&#xff0…

华为升腾显卡选型备忘

目录 1. 开发套件 2. 加速模块 3. 加速卡 4. 训练卡 官方地址&#xff1a;https://www.hiascend.com/ 备注&#xff1a; &#xff08;1&#xff09;V后缀的都是Video视频解析卡&#xff0c;本质是推理卡&#xff1b; &#xff08;2&#xff09;I后缀的都是推理卡&#…

Vue3.0里为什么要用Proxy API替代的defineProperty API

Vue 3.0 中使用 Proxy API 替代 defineProperty API 的原因主要有以下几点&#xff1a; 性能优化&#xff1a;Proxy 可以拦截对象的任意操作&#xff0c;而 defineProperty 只能拦截属性的读取&#xff08;get&#xff09;和设置&#xff08;set&#xff09;操作。Proxy 的性能…

(python)小学出题热门词汇可视化绘制

1.代码 import pandas as pd from wordcloud import WordCloud import matplotlib.pyplot as plt from collections import Counter import jieba # 如果你处理的是中文文本&#xff0c;需要jieba分词 import re # 停用词列表&#xff0c;这里只是示例&#xff0c…

Swift 周报 第五十四期

文章目录 前言新闻和社区苹果上架 iPhone 14/Pro 官翻机&#xff1a;起售价不到 5000 元苹果 iPhone SE 4 售价曝光苹果针对欧盟 20 亿美元罚单提起上诉 双方另一场“缠斗”已跨越近八年 提案通过的提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编…

gbase8s的并行任务(查询、索引和监控)-1

(一) 并行查询的概述 1. 并行查询操作的概述 通过大的数据查询分成许多小的并行任务&#xff0c;每个任务由一个线索进行完成&#xff0c;每个线索运行在不同的物理CPU上&#xff0c;通过多个CPU共同完成一个任务&#xff0c;达到真正的并行gbase8s数据库的并行查询功能称为P…

SAP ABAP 之OOALV

文章目录 前言一、案例介绍/笔者需求二、SE24 查看类 a.基本属性 Properties b.接口 Interfaces c.友元 Friends d.属性 Attributes e.方法 Methods f.事件 Events g.局部类型 Types …

Vulnhub--AI: WEB: 2

渗透复现 平台框架存在目录穿越漏洞&#xff0c;利用该漏洞读取敏感信息 Ping功能点绕过&#xff0c;进行命令执行操作&#xff0c;反弹shell无果后&#xff0c;利用目录穿越漏洞遍历敏感API&#xff0c;读取到用户SSH登录凭证 SSH登录进行Linux lxd容器提权 知识扩展 目录…

企业运维六边形战士 质量稳定 效率为王

随着信息化的不断深入和扩展&#xff0c;企业IT系统的复杂性和设备多样性日益增加。为了保障业务的高可用性和连续性&#xff0c;企业需要一个全面、高效、智能的一体化运维管理平台。在用户市场的推动下&#xff0c;LinkSLA智能运维管家展现出【六边形战士】的优质属性&#x…

最年轻的国家最高科技奖得主,量子领域科学家:薛其坤

6月24日&#xff0c;2023年度国家最高科学技术奖在京揭晓&#xff0c;李德仁院士、薛其坤院士获得中国科技界崇高荣誉。 薛其坤是凝聚态物理领域著名科学家&#xff0c;取得多项引领性的重要科学突破&#xff0c;包括&#xff1a;他率领团队首次实验观测到量子反常霍尔效应&am…