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

loopvar 改动不同版本的影响-基础循环

示例代码

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

代码说明

这个代码先打印了使用的golang的版本,然后进行一个for循环,for循环中打印了变量i的地址
执行go run xxx.go看下结果

golang 1.21的运行结果

go run demo/basic_for.go
golang version: go1.21.5
0xc0000120d8
0xc0000120d8
0xc0000120d8
0xc0000120d8
0xc0000120d8
0xc0000120d8
0xc0000120d8
0xc0000120d8
0xc0000120d8
0xc0000120d8

可以看到在1.21.5这个版本中,打印出来的地址都是一样的,在1.22中又会如何呢

golang 1.22的运行结果

go run demo/basic_for.go
golang version: go1.22.1
0xc0000a6020
0xc0000a6028
0xc0000a6030
0xc0000a6038
0xc0000a6040
0xc0000a6048
0xc0000a6050
0xc0000a6058
0xc0000a6060
0xc0000a6068

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

再举个例子

package mainimport ("fmt"
)func main() {var ids []*intfor i := 0; i < 10; i++ {ids = append(ids, &i)}for _, v := range ids {fmt.Println("demo i value:", *v)}
}

在1.21的版本中的结果:

golang version: go1.21.5
demo i value:10,demo i value:10,demo i value:10,demo i value:10,demo i value:10,demo i value:10,demo i value:10,demo i value:10,demo i value:10,demo i value:10,

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

在1.22的版本中的结果

`golang version: go1.22.1
demo i value:0,demo i value:1,demo i value:2,demo i value:3,demo i value:4,demo i value:5,demo i value:6,demo i value:7,demo i value:8,demo i value:9,

上述的1.21存在问题的代码有比较简单的解决办法就是在循环中加上一行代码i:=i就可以解决问题。
出现上述问题的原因是1.22 loopvar的规则变了,1.22之前的版本中for循环中的变量只会循环一次,不论需要循环多少次都只初始化一次,但是1.22中变成了每次循环逗号创建新变量,以避免意外共享bug。
golang的release note是这么描述的Previously, the variables declared by a “for” loop were created once and updated by each iteration. In Go 1.22, each iteration of the loop creates new variables, to avoid accidental sharing bugs.

相关文章:

  • 【Web】NSSCTF Round#20 Basic 个人wp
  • 将jupyter notebook文件导出为pdf(简单有效)
  • 7-294 筛法求素数(埃式筛、欧拉筛)
  • 信号处理--情绪分类数据集DEAP预处理(python版)
  • Redis基础命令集详解
  • C#(winform) 调用MATLAB函数
  • 【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)
  • Django安装及第一个项目
  • 小白从0学习ctf(web安全)
  • Day53:WEB攻防-XSS跨站SVGPDFFlashMXSSUXSS配合上传文件添加脚本
  • 【微服务篇】深入理解微服务网关原理以及Spring Gateway
  • 蓝桥杯第七届大学B组详解
  • 3.学习前后端关联
  • 道可云元宇宙每日资讯|元宇宙标准化工作组成立大会召开
  • 笔记: JavaSE day16笔记 - string字符串
  • Javascript Math对象和Date对象常用方法详解
  • Javascript编码规范
  • LintCode 31. partitionArray 数组划分
  • Quartz初级教程
  • Redis 中的布隆过滤器
  • Sequelize 中文文档 v4 - Getting started - 入门
  • Spring Cloud Feign的两种使用姿势
  • Swoft 源码剖析 - 代码自动更新机制
  • 记一次删除Git记录中的大文件的过程
  • 前端面试之CSS3新特性
  • 算法---两个栈实现一个队列
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 阿里云ACE认证学习知识点梳理
  • 积累各种好的链接
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​马来语翻译中文去哪比较好?
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (C++)八皇后问题
  • (C语言)逆序输出字符串
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (k8s中)docker netty OOM问题记录
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (转)Sublime Text3配置Lua运行环境
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .gitignore文件—git忽略文件
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .net 反编译_.net反编译的相关问题
  • .net快速开发框架源码分享
  • .NET委托:一个关于C#的睡前故事
  • @AutoConfigurationPackage的使用
  • @Autowired和@Resource装配
  • @RunWith注解作用
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [383] 赎金信 js
  • [Android] Implementation vs API dependency
  • [APIO2012] 派遣 dispatching
  • [BZOJ4566][HAOI2016]找相同字符(SAM)
  • [C]整形提升(转载)