golang的defer执行时机案例分析
package main
import "fmt"func calcFunc(x int, y int) int {return x + y
}func main() {// defer语句的执行顺序是,从右到左,逆序执行deferDemo()// deferDemo1函数demo1 := deferDemo1()fmt.Println(demo1) // 0// deferDemo2函数demo2 := deferDemo2()fmt.Println(demo2) // 1// deferDemo4demo4 := deferDemo4()fmt.Println(demo4) // 1// deferDemo5demo5 := deferDemo5()fmt.Println(demo5) // 1// deferDemo6demo6 := deferDemo6()fmt.Println(demo6) // 2// 难点解析/*分析:defer注册顺序:1.defer fmt.Println("AA", calcFunc(x, calcFunc(x, y)))2.defer fmt.Println("BB", calcFunc(x, calcFunc(x, y)))defer执行顺序:1. fmt.Println("BB", calcFunc(x, calcFunc(x, y)))2. fmt.Println("AA", calcFunc(x, calcFunc(x, y)))*/x := 1y := 2// 注册的时候 x = 1, y = 2 所以执行的时候x = 1, y = 2defer fmt.Println("AA", calcFunc(x, calcFunc(x, y))) // calcFunc(1,1+2) // 结果是:4x = 10// 注册的时候x = 10, y = 2 所以执行的时候x = 10, y = 2defer fmt.Println("BB", calcFunc(x, calcFunc(x, y))) // calcFunc(10,10+2) // 结果是:22y = 20}
分析:
defer语句的执行顺序是,从右到左,逆序执行
执行deferDemo()函数时,会先执行defer语句,再执行函数体,函数体执行完后,再执行defer语句
执行结果:
开启defer
结束defer
defer语句6
defer语句5
defer语句4
defer语句3
defer语句2
defer语句1
func deferDemo() {fmt.Println("开启defer")defer func() {fmt.Println("defer语句1")}()defer func() {fmt.Println("defer语句2")}()defer func() {fmt.Println("defer语句3")}()defer fmt.Println("defer语句4")defer fmt.Println("defer语句5")defer fmt.Println("defer语句6")fmt.Println("结束defer")
}
deferDemo1执行结果是 0,延迟执行
func deferDemo1() int {var a intdefer func() {a++}()return a
}
deferDemo1执行结果是1:原因返回匿名返回值a等待函数体内操作完成才会执行return
func deferDemo2() (a int) {// 步骤一先赋值//a = 0// 步骤二再执行defer语句defer func() {a++}()// 步骤三再执行函数体// 返回值a等待函数体内操作完成才会执行returnreturn a
}
deferDemo3执行结果是1: 原因返回匿名返回值a等待函数体内操作完成才会执行return
func deferDemo3() (a int) {defer func() {a++}()return a
}
deferDemo4
func deferDemo4() int {x := 1defer func(x int) {x++ // 内部x和外面x不是同一个变量}(x)return x // 1
}
deferDemo5
func deferDemo5() (x int) {x = 1defer func(x int) {x++ // 内部x和外面x不是同一个变量}(x)return x // 1
}
deferDemo6
func deferDemo6() (x int) {x = 1defer func() {x++}()return x // 2
}
相关文章:
golang的defer执行时机案例分析
package main import "fmt"func calcFunc(x int, y int) int {return x y }func main() {// defer语句的执行顺序是,从右到左,逆序执行deferDemo()// deferDemo1函数demo1 : deferDemo1()fmt.Println(demo1) // 0// deferDemo2函数demo2 : deferDemo2()f…...
2.HTML中常用浏览器
2.常用浏览器 2.1 什么是浏览器 浏览器是网页显示,运行的平台。常用的浏览器有IE,火狐,谷歌,Safari和Opera等 平时成为五大浏览器 2.2 浏览器内核 浏览器内核(渲染引擎):负责读取网页内容&…...
Vue 监听store数据变化
天冷了,手也冷了,于学问于个人成长不能因为冷而荒废。毕业这么多年,只能感慨。这样努力的工作只是解决了温保问题,何时才能任性的过一回说走就走的自由生活? 大抵这样的梦想也就只能停留在梦里与期待中吧,与…...
智能交通和自动驾驶技术
一、定义 智能交通和自动驾驶技术是指利用先进的信息技术和人工智能技术,实现交通系统的智能化和自动化。智能交通和自动驾驶技术不仅可以提高交通系统的效率和安全性,还可以改善人们的出行体验,促进城市可持续发展。 智能交通和自动驾驶技…...
CentOS7安装部署StarRocks
文章目录 CentOS7安装部署StarRocks一、前言1.简介2.环境 二、正文1.StarRocks基础1)架构图2)通讯端口 2.部署服务器3.安装基础环境1)安装JDK 112)修改机器名3)安装GCC4)关闭交换分区(swap&…...
树形Dp 2925. 在树上执行操作以后得到的最大分数
2925. 在树上执行操作以后得到的最大分数 两次DFS class Solution { public:// 节点状态有两种,选和不选,// dp(u, fa, 0) 不选u 节点,其他节点都可以选,值为以u为根的子树的所有节点的和- 根节点的值。// dp(u, fa, 1) 选u节点&…...
选择企业云盘?品牌推荐和评价解析
企业云盘是如今热门的企业协作工具,为企业提供了文件存储、文件共享服务。市面上的企业云盘千千万,到底哪个企业云盘好用?哪些品牌值得信赖呢? 好用的企业云盘,不能不提,Zoho Workdrive企业云盘为企业提供…...
redis: 记录一次线上redis内存占用过大问题解决过程
引言 记录一次线上redis占用过大的排查过程,供后续参考 问题背景 测试同事突然反馈测试环境的web系统无法登陆,同时发现其他子系统也存在各类使用问题 排查过程 1、因为首先反馈的是测试环境系统无法登陆,于是首先去查看了登陆功能的报错…...
数据资产、数字资产、数据资源及数据资产入表
数据要素 《中共中央关于坚持和完善中国特色社会主义制度推进国家治理体系和治理能力现代化若干重大的决议》(2019) 首次将数据列为生产要素 《关于构建更加完善的要素市场化配置体制机制的意见》(2020.3) 数据成为土地、劳动力、…...
Docker之Centos安装
介绍 Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的, 而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。 在很多版本的CentOS中是不支持更新最新的一些补丁包的。由于我们学习的环境都使用的是CentOS,因此这里我们将Do…...
SQL注入漏洞:CMS布尔盲注python脚本编写
SQL注入漏洞:CMS布尔盲注python脚本编写 文章目录 SQL注入漏洞:CMS布尔盲注python脚本编写库名爆破爆破表名用户名密码爆破 库名爆破 import requests #库名 database"" x0 while requests.get(urlf"http://10.9.47.77/cms/show.php?id33%20and%20length(data…...
security
Java Security 是一个用于在 Java 平台上提供安全性的框架。下面是 Java Security 的一些主要知识点: 1. 加密和解密:Java Security 提供了一组加密和解密 API,可以实现各种加密标准,如 AES、DES、RSA 等。 2. 数字签名…...
了解web3,什么是web3
Web3是指下一代互联网,它基于区块链技术,将各种在线活动更加安全、透明和去中心化。Web3是一个广义的概念,它包括了很多方面,如数字货币、去中心化应用、智能合约等等。听不懂且大多数人听到这个东西,直觉感觉就像骗子…...
Harbor企业级Registry基础镜像仓库的详细安装使用教程(保姆级)
Harbor Docker 官方提供的私有仓库 registry,用起来虽然简单 ,但在管理的功能上存在不足。 Harbor是vmware一个用于存储和分发Docker镜像的企业级Registry服务器,harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。 ha…...
Linux系统下数据同步服务RSYNC
一、RSYNC概述 1、什么是rsync rsync的好姐妹 sync 同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级块。 async 异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁…...
Docker介绍及其常用命令
Docker是一种容器化技术,可以打包应用程序及其依赖项,并将其作为独立的进程运行。它实现了操作系统级别的虚拟化,允许不同容器之间相互隔离,同时提高了应用程序的可移植性和安全性。Docker可以快速部署和扩展应用程序,…...
SwissArmyTransformer瑞士军刀工具箱使用手册
Introduction sat(SwissArmyTransformer)是一个灵活而强大的库,用于开发您自己的Transformer变体。 sat是以“瑞士军刀”命名的,这意味着所有型号(例如BERT、GPT、T5、GLM、CogView、ViT…)共享相同的backo…...
unity【动画】脚本_角色动画控制器 c#
首先创建一个代码文件夹Scripts 从人物角色Player的基类开始 创建IPlayer类 首先我们考虑到如果不挂载MonoBehaviour需要将角色设置成预制体实例化到场景上十分麻烦, 所以我们采用继承MonoBehaviour类的角色基类方法写代码 也就是说这个脚本直接绑定在角色物体…...
Java代码如何对Excel文件进行zip压缩
1:新建 ZipUtils 工具类 package com.ly.cloud.datacollection.util;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import ja…...
改进YOLO系列:12.Repulsion损失函数【遮挡】
1. RepLoss论文 物体遮挡问题可以分为类内遮挡和类间遮挡两种情况。类间遮挡产生于扎堆的同类物体,也被称为密集遮挡(crowd occlusion)。Repulsion损失函数由三个部分构成,yolov5样本匹配,得到的目标框和预测框-一对应第一部分主要作用:预测目标框吸引IOU最大的真实目标框,…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
