go中for range的坑以及解决方案

一、for range的坑

相信小伙伴都遇到过以下的循环变量的问题,那是因为循环的val变量是重复使用的,即仅有一份。也就是说,每次循环后赋给val的值就会把前面循环赋给val的值替换掉,所以打印出来的值都是最后一次循环赋给val的值。

1、例子

func fr1() {arr := []int{1, 2, 3}for _, val := range arr {go func() {time.Sleep(time.Millisecond * 100)fmt.Println(val)}()}time.Sleep(time.Second)
}
//输出结果:3 3 3 func fr2() {arr := [2]int{1, 2}arrnew := []*int{}for _, val := range arr {arrnew = append(arrnew, &v)}fmt.Println(*arrnew[0], *arrnew[1])//输出结果: 2 2
}

2、解决方案

使用局部变量/临时变量,即可解决

func fr1() {values := []int{1, 2, 3, 4, 5}for _, val := range values {//在这加入临时变量val := val go func() {time.Sleep(time.Millisecond * 100)fmt.Println(val)}()}time.Sleep(time.Second)
}
//输出结果:2 3 1 4 5 或 5 3 4 1 2 等无序结果//===========================或者=============================func fr1() {values := []int{1, 2, 3, 4, 5}for _, val := range values {//传入变量go func(val int) {time.Sleep(time.Millisecond * 100)fmt.Println(val)}(val)}time.Sleep(time.Second)
}
//输出结果:2 3 1 4 5 或 5 3 4 1 2 等无序结果

二、官方解决方案

1、在Go1.21版本中,提前体验

        可以设置 GOEXPERIMENT=loopvar,就会解决以上问题,运行代码时就不会出现以上的坑。

Windows中设置举例

go env -w GOEXPERIMENT=loopvar
或
$env:GOEXPERIMENT="loopvar"
> go env
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Administrator\AppData\Local\go-build
set GOENV=C:\Users\Administrator\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=loopvar
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\Administrator\go\pkg\mod

2、预计在 Go1.22 起,在go.mod中支持

新的 for 循环语义,将会在 go.mod 文件中的 go 行(版本声明大于等于 Go1.22 下)默认应用也就不用设置 GOEXPERIMENT=loopvar 

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

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

相关文章

openeuler的安装和两台linux主机配置ssh实现互相免密登陆

一、openeuler的安装 下载OpenEuler - 网址:https://www.openeuler.org/zh/download/archive/ - 版本选择:openEuler 22.03 LTS SP2 (镜像文件) ,即长期更新版 设置自定义硬件 内存:推荐2GB 处理器&…

oracle基本用户管理和权限分配

1.用户与模式的关系,一一对应的关系 2.创建与管理用户 2.1创建用户语法 CREATE user wdf IDENTIFIED by tiger--创建用户wdf,密码tiger DEFAULT tablespace users--用户的默认表空间 quota 10M on users;--在表空间的占用最大空间 注意:用户创建以后…

rke2 Offline Deploy Rancher v2.8.0 latest (helm 离线部署 rancher v2.8.0)

文章目录 预备条件为什么是三个节点?​预备条件配置私有仓库介质清单安装 helm安装 cert-manager下载介质镜像入库helm 部署卸载 安装 rancher镜像入库helm 安装 验证 预备条件 所有支持的操作系统都使用 64-bit x86 架构。Rancher 兼容当前所有的主流 Linux 发行版…

如何通过兴趣爱好选职业?

一个错误的选择,可能造成终身的遗憾,一个正确的选择,可以让我们少奋斗几十年。所以无论现在付出多少代价,多花一些时间,去研究以下未来的职业方向,这是值得的。 职业定位(专业定位)…

深兰科技AI医疗健康产品获3000台采购订单

12月6日,武汉某企业与深兰科技签署协议,一次性采购3000台深兰科技AI生理健康检测仪——扁鹊。 深兰科技AI生理健康检测仪——扁鹊是深兰科技推出的人体生理指标检测产品。基于AI生物技术、融合互联网医疗及AIoT技术,深兰科技AI生理健康检测仪…

YOLOv8-Seg改进:轻量化改进 | 华为Ghostnet,超越谷歌MobileNet | CVPR2020

🚀🚀🚀本文改进: Ghost bottleneck为堆叠Ghost模块 ,与YOLOV8建立轻量C2f_GhostBottleneck 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提…

HubSpot CRM:卓越客户服务的关键引擎

在数字化时代,提供卓越的客户服务是企业成功的关键之一。HubSpot CRM以其强大的功能和灵活性,成为实现卓越客户服务的关键引擎,以下是强调HubSpot CRM在客户服务中的应用的关键方面: 1. 全面的客户视图 HubSpot CRM集成了全面的…

【llm 部署运行videochat--完整教程】

申请llama权重 https://ai.meta.com/resources/models-and-libraries/llama-downloads/-> 勾选三个模型 -> 等待接收邮件信息(很快)下载llama代码库 git clone https://github.com/facebookresearch/llama.git cd llama bash download.py-> 输…

《路由与交换技术》---练习题(无答案纯享版)

注意!!!这篇blog是无答案纯享版的 选择填空的答案我会放评论区 简答题可以看这里 计算题可以发私信问我(当然WeChat也成)but回讯息很慢 一、选择题 1.以下不会在路由表里出现的是: ( ) A.下一跳地址 B.网络地址 C…

科大讯飞星火大模型加持数字员工系列产品发布

面对时代浪潮,基业长青的企业总会率先拥抱变化,在时代交替中创造新的增长空间。当数字化浪潮涌入千行百业,企业掌舵者如何选择转型? 从数字员工到灯塔工厂,愈发成熟的人工智能技术已深入企业管理,持续提高…

小白苦恼:电脑那么多USB口,怎么知道哪个读写更快?

前言 最近有个朋友和小白抱怨:电脑那么多USB接口,有些接口在传输文件的时候实在慢的很。 电脑诞生以来,USB接口就一直存在。但是USB接口还是长得几乎一样,不仔细去研究都不知道哪个USB会更快。 许多小伙伴就会直接放弃辨认&…

计算机导论03-计算机组成

计算机系统结构 冯•诺依曼体系结构 冯•诺依曼体系结构的基本要点 冯•诺依曼思想即冯•诺依曼体系结构思想,其最基本的概念是存储程序概念,它奠定了现代计算机的结构基础。 功能部件: 计算机必须具备五大基本组成部件,包括:运…

3个Linux文件权限命令

文件权限命令允许你修改用户的访问权限。这包括设置读/写/执行权限、更改所有权和默认文件模式。 1. chmod 命令 – 更改文件模式或访问权限 chmod命令允许您快速更改文件的模式(权限)。它有很多可用的选项。 文件的基本权限包括: r (只读…

程序员试用期转正工作总结

一、试用期工作总结 在公司的三个月试用期中,我完成了以下工作: 完成了XX个功能模块的开发,包括XX模块、XX模块和XX模块。参与了XX个项目的开发和上线,其中XX项目、XX项目和XX项目是我主导的。优化了现有系统的性能,特…

Anaconda定制Python编程并打包

本文主要介绍如何使用Anaconda定制一个Python编程环境并打包,方便编程环境迁移。 文章参考 谢作如 邱奕盛两位老师的《为信息科技教学定制一个Python编程环境》 * 开发不同的项目需要不同的库(甚至不同版本),把所有的库安装到一…

mac录屏软件有哪些?分享5个实用软件

mac录屏软件有哪些?随着Mac电脑在创意和专业领域的使用日益普及,越来越多的用户需要录制屏幕内容以进行分享、演示或后期编辑。本文将为您介绍几款知名的Mac录屏软件,让您轻松实现屏幕录制的需求。 1.迅捷屏幕录像工具 这是一款功能强大的屏…

掌握Java Future模式及其灵活应用

第1章:引言 大家好,我是小黑,今天咱们来聊聊Future。咱们程序员在日常工作中,肯定都遇到过需要处理耗时任务的情况,特别是在Java领域。比如说,小黑要从网络上下载数据,或者要执行一个计算密集型…

推理证明-条件等价式、德摩根律、双条件

对于命题逻辑部分来说,只需要掌握命题的符号化,以及如何进行推理证明即可。足矣。其他的都是一些基本的概念,扫一遍,记住即可。 对于什么是命题:陈述句、能判断、真值唯一 进行推理证明,我们需要记住以下…

渐进增强与优雅降级:提升用户体验的双重策略

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

强强联合:RPA的九大优势与流程挖掘的深度融合

RPA技术与人工智能相似,常被认为具有双面性:一方面,它因能够显著提升业务效率而受到赞扬;另一方面,这种自动化的优势可能导致人类员工的工作职责受限,从而引发对工作安全的忧虑。同时,关于RPA的…