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


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

相关推荐
大鸡腿同学19 小时前
【成长类】《只有偏执狂才能生存》读书笔记:程序员的偏执型成长地图
后端
0xDevNull19 小时前
MySQL数据冷热分离详解
后端·mysql
AI袋鼠帝20 小时前
OpenClaw(龙虾)最强开源对手!Github 40K Star了,又一个爆火的Agent..
后端
lly20240620 小时前
C 标准库 - `<stdio.h>`
开发语言
沫璃染墨20 小时前
C++ string 从入门到精通:构造、迭代器、容量接口全解析
c语言·开发语言·c++
jwn99920 小时前
Laravel6.x核心特性全解析
开发语言·php·laravel
迷藏49420 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
功德+n20 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
明日清晨20 小时前
python扫码登录dy
开发语言·python
我是唐青枫20 小时前
C#.NET gRPC 深入解析:Proto 定义、流式调用与服务间通信取舍
开发语言·c#·.net