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

示例代码

package main

import (
	"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 main

import (
	"fmt"
)

func main() {
	var ids []*int
	for 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.

相关推荐

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

    2024-03-29 07:50:01       44 阅读
  2. loopvar 改动不同版本影响-并发

    2024-03-29 07:50:01       33 阅读
  3. loopvar 改动不同版本影响-大循环执行时间

    2024-03-29 07:50:01       36 阅读
  4. loopvar 改动不同版本影响-defer,closures

    2024-03-29 07:50:01       37 阅读
  5. 不同情绪调节策略影响拖延行为神经基础

    2024-03-29 07:50:01       32 阅读
  6. STM32 不同时钟频率有什么不同影响

    2024-03-29 07:50:01       22 阅读
  7. HTTP不同版本区别

    2024-03-29 07:50:01       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-29 07:50:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-29 07:50:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-29 07:50:01       82 阅读
  4. Python语言-面向对象

    2024-03-29 07:50:01       91 阅读

热门阅读

  1. 包和权限修饰符

    2024-03-29 07:50:01       41 阅读
  2. Pytorch:torch.stack 和 torch.as_tensor

    2024-03-29 07:50:01       39 阅读
  3. llama.cpp 编译安装@Ubuntu

    2024-03-29 07:50:01       41 阅读
  4. 设计模式一详解

    2024-03-29 07:50:01       36 阅读
  5. 每天一个数据分析题(二百三十七)

    2024-03-29 07:50:01       41 阅读
  6. admin端

    admin端

    2024-03-29 07:50:01      32 阅读
  7. 滑动模块-力扣-下一个排列

    2024-03-29 07:50:01       47 阅读
  8. 汇编开关atapi设备

    2024-03-29 07:50:01       40 阅读
  9. 实时数据库测试-汇编小程序

    2024-03-29 07:50:01       34 阅读
  10. openEuler 22.03 安装 .NET 8.0

    2024-03-29 07:50:01       40 阅读
  11. kotlin使用validation注解无效

    2024-03-29 07:50:01       42 阅读
  12. python中对象赋值、引用与拷贝的理解与应用

    2024-03-29 07:50:01       44 阅读