golang rang指针数据的坑

仅为记录学习golang过程中遇到的坑

golang 复制代码
func main()  {
	type data struct {
		num int
	}

	datas := []data{
		{1},
		{2},
		{3},
		{4},
		{5},
	}

	for _,tmp := range datas{
		go func(d *data) {
			fmt.Println(d.num)
		}(&tmp)
	}

	time.Sleep(10 * time.Second)
}

预期输出:

1,2,3,4,5 (不会按序输出,但是每个数字有且只有一次)

实际输出:

4,5,5,5,5

这是由于tmp只声明了一次,在for循环过程中被改变了值,指向的数据发生了变化,所以在对tmp取内存地址时,会导致数据变化。

可以采用如下方式修改,或者采用值传递参数

golang 复制代码
func main()  {
	type data struct {
		num int
	}

	datas := []data{
		{1},
		{2},
		{3},
		{4},
		{5},
	}

	for index,_ := range datas{
		go func(d *data) {
			fmt.Println(d.num)
		}(&datas[index])
	}

	time.Sleep(10 * time.Second)
}

推荐阅读

1、原来阿里字节员工简历长这样

2、一条SQL差点引发离职

3、MySQL并发插入导致死锁


如果你也觉得我的分享有价值,记得点赞或者收藏哦!你的鼓励与支持,会让我更有动力写出更好的文章哦!

相关推荐
CodeSheep6 小时前
“渐渐能理解为何不愿意雇佣35岁以上程序猿。去年换了份工作,组里4位组员其中3位40+,发现其实最大的问题并不是说精力不济卷不动”
前端·后端·程序员
摸鱼的春哥7 小时前
【实战】吃透龙虾🦞,你写的Agent也能支持Skills渐进式披露
前端·javascript·后端
明月_清风7 小时前
从“能用”到“专业”:构建生产级装饰器与三层逻辑拆解
后端·python
万少14 小时前
小龙虾(openclaw),轻松玩转自动发帖
前端·人工智能·后端
Jagger_16 小时前
AI 洪水淹到脖子了:剩下的是什么?我们该往哪儿跑?
后端
Victor35617 小时前
MongoDB(28)什么是地理空间索引?
后端
Victor35617 小时前
MongoDB(29)如何创建索引?
后端
皮皮林55117 小时前
面试官:什么是 fail-fast?什么是 fail-safe?
后端
陈随易18 小时前
前端大咖mizchi不满Rust、TypeScript却爱上MoonBit
前端·后端·程序员