loopvar 改动不同版本的影响-defer,closures

defer示例代码

package mainimport ("fmt""runtime"
)func main() {fmt.Println("golang version:", runtime.Version())defer_demo()
}func defer_demo() {defer println()for counter, n := 0, 0; n < 3; n++ {defer func(v int) {fmt.Print(counter)counter++}(n)}
}

代码说明

这个代码先打印了使用的golang的版本,然后进行一个for循环,for循环中定义了一个defer func,打印出循环时定义的变量counter的值,在counter自增 go run xxx.go看下结果

golang 1.21的运行结果

go run demo/defer.go
golang version: go1.21.5
012

可以看到在1.21.5这个版本中,打印出来的counter值自增成功了,在1.22中又会如何呢

golang 1.22的运行结果

go run demo/defer.go     
golang version: go1.22.1
000

可以看到在1.22.1的这个版本中,打印出来的值都是一样的。

再举个例子

package mainimport ("fmt""runtime"
)func main() {fmt.Println("golang version:", runtime.Version())defer_demo()
}func defer_demo() {for i := 0; i < 3; i++ {defer func() {fmt.Println(i)}()}
}

在1.21的版本中的结果:

go run demo/defer2.go
golang version: go1.21.5
3
3
3

可以看到ids这个slice中的值都是10

在1.22的版本中的结果

go run demo/defer2.go
golang version: go1.22.1
2
1
0

修改方法

第一个例子本意应该是让counter自增的,可以把counter的定义放在循环外面.修改后的代码

package mainimport ("fmt""runtime"
)func main() {fmt.Println("golang version:", runtime.Version())defer_demo()
}func defer_demo() {counter := 0defer println()for n := 0; n < 3; n++ {defer func(v int) {fmt.Print(counter)counter++}(n)}
}

1.21和1.22的执行结果

go run demo/defer.go 
golang version: go1.21.5
012go run demo/defer.go
golang version: go1.22.1
012

针对第二个例子改动比较简单,把循环变量作为defer func的参数即可,修改后的代码

package mainimport ("fmt""runtime"
)func main() {fmt.Println("golang version:", runtime.Version())defer_demo()
}func defer_demo() {for i := 0; i < 3; i++ {defer func(i int) {fmt.Println(i)}(i)}
}

这样1.21和1.22的结果就都一样了

go run demo/defer2.go
golang version: go1.21.5
2
1
0go run demo/defer2.go
golang version: go1.22.1
2
1
0

第二个例子如果把defer func换成一个closures也会出现1.21和1.22打印不一样的情况

代码

package mainimport ("fmt""runtime"
)func main() {fmt.Println("golang version:", runtime.Version())defer_demo()
}func defer_demo() {var demoFunc func()for i := 0; i < 3; i++ {if demoFunc == nil {demoFunc = func() {fmt.Println(i)}}demoFunc()}
}

运行结果

go run demo/closures.go
golang version: go1.21.5
0
1
2go run demo/closures.go
golang version: go1.22.1
0
0
0

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

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

相关文章

Windows深度学习环境----Cuda version 10.2 pytorch3d version 0.3.0

Requirements Python version 3.8.5Pytorch version: pytorch1.6.0 torchvision0.8.2 torchaudio0.7.0 cudatoolkit10.2.89pytorch3d version 0.3.0Cuda version 10.2 感觉readme文件里的不适配&#xff0c;跟pytorch官网不同 以前的 PyTorch 版本 |PyTorch的 # CUDA 10.2 c…

2024-04-08 问AI: 介绍一下AI 大神 吴恩达

文心一言 吴恩达&#xff08;Andrew Ng&#xff09;是AI领域的一位重要人物&#xff0c;他的贡献和影响力在学术界、工业界以及在线教育领域都极为显著。 吴恩达出生于1976年&#xff0c;是一位华裔美国人&#xff0c;他在斯坦福大学担任计算机科学系和电子工程系的副教授&am…

充电桩项目,开源啦!

好&#xff0c;我是田哥 很多人&#xff0c;最近都在关注我的充电桩项目&#xff0c;之前建了一个微服务架构的项目&#xff0c;也有单体项目的代码开源。 今天&#xff0c;我把最新版微服务架构的充电桩项目源代码开源。 充电桩的输入端与交流电网直接连接&#xff0c;输出端都…

WindowServer2019远程桌面无法连接问题及处理方法

WindowServer2019远程桌面无法连接问题及处理方法 文章目录 WindowServer2019远程桌面无法连接问题及处理方法1. 问题描述1. 连接问题2. 原因分析 2. 解决方法1. 零时解决方法2. 永久解决方法1. 打开注册表编辑器2. GracePeriod的权限权限设置3. 删除REG_BINARY4. 重启 1. 问题…

VMware配置环境(安装运行问题)及系列dns端口网络类型IP远程连接学习之(详谈8000字)

安装vmware快速配置步骤 下载VMware安装包 在下载好VMware安装包之后双击运行 接受条款 关闭VMware自动更新 勾选快捷键方式 安装VMware安装 输入许可证&#xff08;有需要私信小编&#xff09; 安装完成 重启电脑即可 最终成功界面: 安装Linux系统 创建虚拟机 选择…

【代码随想录】【贪心算法】day36:无重叠子区间,划分字母区间,合并区间

class Solution(object):def eraseOverlapIntervals(self, intervals):""":type intervals: List[List[int]]:rtype: int"""intervals.sort(keylambda x:x[0])count0# 可以记录重叠子区间的个数&#xff0c;然后让整个数组的长度减去重叠的个数#…

基于springboot+vue+Mysql的滴答拍摄影项目

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

Windows远程执行

Windows远程执行 前言 1、在办公环境中&#xff0c;利用系统本身的远程服务进行远程代码执行甚至内网穿透横向移动的安全事件是非常可怕的&#xff0c;因此系统本身的一些远程服务在没有必要的情况下建议关闭&#xff0c;防止意外发生&#xff1b; 2、作为安全人员&#xff0…

学会了一门编程语言,如何1天入手其它编程语言?

1 语言之间都是相通的&#xff0c;核心在于计算机四大件和项目逻辑&#xff1a; 1.1 计算机专业四大件&#xff1a; 数据结构和算法、操作系统、计算机网络、计算机组成原理。 计算机组成原理、操作系统、数据结构和计算机网络融会贯通_操作系统&#xff0c;计算机网络&#…

easyexcel处理复杂表头

需求&#xff0c;模板如下 功能如下 开始整活&#xff0c;依赖包。 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.1</version> </dependency>下载导入模板 1.方法 GetMapping…

【Vue】我的第一个组件

文章目录 项目简介 项目简介 项目根目录中的index.html是项目的入口文件 加载index.html&#xff0c;vite解析。指向的src下的ts文件或者js文件 最后通过vue3的createApp函数创建一个应用&#xff0c;并挂载到指定div下 App.vue结构说明 特别注意:script脚本内&#xff0…

基于单片机四路温度报警系统仿真设计

**单片机设计介绍&#xff0c; 基于单片机四路温度报警系统仿真设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机四路温度报警系统仿真设计概要主要涉及一个使用单片机作为核心控制器的温度监控系统&#xff0c;该系…

新型基础设施建设(新基建)

新型基础设施建设&#xff08;新基建&#xff09;主要包括七个方面&#xff0c;即5G基站建设、特高压、城际高速铁路和城市轨道交通、新能源汽车充电桩、大数据中心、人工智能和工业互联网。 以下是新型基础设施的详细内容&#xff1a; 一、5G基站建设。5G网络的扩展和优化&a…

【canvas】canvas的基础使用(一):创建canvas

canvas Canvas API 提供了一个通过JavaScript 和 HTML的<canvas>元素来绘制图形的方式。它可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。 Canvas API 主要聚焦于 2D 图形。 canvas元素 <canvas> 元素可被用来通过 JavaScript&#xff…

C++ 圆周率的几种求解方法

公众号&#xff1a;编程驿站 圆周率的常见几种求解算法&#xff0c;包括但不仅仅包含特卡洛模拟、割圆法和公式法。本文讲解这几种算法的实现流程。 1. 蒙特卡洛模拟算法 假设有一个半径为1的圆&#xff0c;如图所示。先绘制一个半径为1的圆。则图中阴影部分&#xff08;1/4…

SV学习笔记(八)

文章目录 SV入门练习基本数据类型字符串类型数组类型接口的定义与例化类的封装类的继承package的使用随机约束线程的同步线程的控制虚方法方法&#xff08;任务与函数&#xff09;SV用于设计 参考资料 SV入门练习 基本数据类型 有符号无符号、四状态双状态、枚举类型、结构体…

STM32 F401/411外设内部互联矩阵摘要

STM32 F401/411外设内部互联矩阵摘要 &#x1f4cd;参考文档AN4646&#xff1a;https://www.stmcu.com.cn/Designresource/detail/localization_document/709908(中译) -&#x1f4cc; 相关工程案例《HAL STM32主从定时器联级使用》、《STM32G4 TIM1触发ADC转换》 &#x1f4d…

24考研-东南大学916经验贴

文章目录 一、个人情况二、初试备考经验1.政治 67&#xff0c;客观382.英语 60&#xff0c;客观大概40左右3.数学 136&#xff0c;客观应该满分4.专业课 数据结构计网 114小分不清楚 三、复试备考经验笔试&#xff1a;C面试复试流程 附一下成绩单&#xff1a; 一、个人情况 本…

如何给自己的网站添加 https

文章目录 一、简介二、申请 ssl 证书三、下载 ssl 证书四、配置 nginx五、开放 443 端口六、常见问题解决(一)、配置后&#xff0c;访问 https 无法连接成功(二) 证书配置成功&#xff0c;但是访问 https 还是报不安全 总结参考资料 一、简介 相信大家都知道 https 是更加安全…

【利器篇】前端40+精选VSCode插件,总有几个你未拥有!

前言 姊妹篇&#xff1a; 【利器篇】35精选chrome插件&#xff0c;含15前端插件&#xff0c;总有一款值得你停留 关于关于 【前端工具系列】&#xff1a; 有句话&#xff0c;事半功倍&#xff0c;其必然是借助了某些思想和工具。 VSCode是我们前端开发的武器&#xff0c;本文…