Go 中 for循环内使用协程的变量值脏读问题

问题代码

每个学Go的都要踩的坑。

如下代码的输出, 我们在 for 循环中,使用了协程(go runtime)。

go 复制代码
package main

import (
	"fmt"
	"time"
)

func main() {

	values := []string{"a", "b", "c"}
	for _, v := range values {
		go func() {
			fmt.Println(v)
		}()
	}

	time.Sleep(3 * time.Second)

}

结果是

不是预想的 a,b, c 乱序

原因:因为这里的v 是一个指针变量, 每次循环都会重新赋值, 再执行每次的fmt.Println(v) 之前,v 的值就被改了, 这里被坑惨了。。。

解决手段

重新声明一个变量,传给协程。 代码修改后

go 复制代码
package main

import (
   "fmt"
   "time"
)

func main() {

   values := []string{"a", "b", "c"}
   for _, v := range values {
   	go func(v string) {
   		fmt.Println(v)
   	}(v)
   }

   time.Sleep(3 * time.Second)

}

输出结果:
符合我们的预期。

相关推荐
苍何8 分钟前
我逆向了 329 条 GPT-Image2 提示词模板,全部开源!
后端
苍何12 分钟前
我用多Agent搭了一家跨境电商公司,起飞!
后端
EW Frontier19 分钟前
6G ISAC新范式:基于智能漏波天线的Wi‑Fi通感一体化系统设计与实测【附MATLAB+python代码】
开发语言·python·matlab·music·isac·doa·wi‑fi
Rik27 分钟前
用 AI Skill 封装你的工作流:从代码规范到全流程提效实战
前端·后端
楼田莉子28 分钟前
Linux网络:NAT_代理
linux·运维·服务器·开发语言·c++·后端
YuePeng34 分钟前
我用 30 行 Java 注解,做出了别人花三周写的管理后台,还顺手接入了 DeepSeek
后端·github
froginwe1137 分钟前
jEasyUI 创建基础树形网格
开发语言
研究点啥好呢1 小时前
字节跳动Go后端开发工程师面试题精选:10道高频考题+答案解析
面试·golang·php·求职招聘
Victory_20251 小时前
c#定时器顺序控制写法
开发语言·c#·c#顺序控制+定时器
Cyber4K2 小时前
【Python专项】Nginx访问日志分析时间范围处理示例
开发语言·python·nginx