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并发插入导致死锁


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

相关推荐
寒山李白4 分钟前
Java中高并发线程池的相关面试题详解
java·开发语言·面试·高并发·线程池·多线程
wuhunyu4 分钟前
基于 langchain4j 的简易 MCP Client
后端
幼儿园口算大王6 分钟前
Java是实现大根堆
java·开发语言
想躺平的咸鱼干7 分钟前
RestClient
java·后端·elasticsearch·中间件·intellij-idea
0白露8 分钟前
java的深拷贝与浅拷贝
java·开发语言
用户611847265428 分钟前
C++ 模板编程详解:从基础到元编程
后端
zh_1999510 分钟前
用纯.NET开发并制作一个智能桌面机器人(五):使用.NET为树莓派开发Wifi配网功能
开发语言·php·.net·树莓派
天天摸鱼的java工程师41 分钟前
ThreadLocal 内存泄漏场景与解决方案深度剖析
后端
天天摸鱼的java工程师41 分钟前
从原理到实战:深度解析 ThreadLocal 的用法
后端
hbwhmama1 小时前
ubuntu24.04安装IDEA2025.1.2搭建java开发环境
java·开发语言