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)

}

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

相关推荐
geovindu6 分钟前
python: Reactor Pattern
开发语言·python·设计模式·反应器模式
迷茫运维路8 分钟前
Casbin学习教程
golang·casbin
掘金者阿豪10 分钟前
这本讲故事的数学科普书里,藏着AI背后的底层密码
后端
CS_SKILL12 分钟前
吉比特 C++ 实习一面面经:一轮把 C++、容器、并发、排序和网络全扫了一遍
java·开发语言·校招面经·实习面经·技术面经·吉比特校招
库拉AI小李13 分钟前
# 数据清洗与分析:Gemini 3.5 处理 Excel 数据的实操体验
前端·人工智能·后端
feifeigo12313 分钟前
基于多混沌映射的图像加密(MATLAB实现)
开发语言·matlab
techdashen16 分钟前
Go 语言仓库 Top 100 贡献者分析报告
开发语言·后端·golang
何以解忧,唯有..17 分钟前
Go 语言变量命名规范详解
开发语言·后端·golang
Python私教19 分钟前
001 Pandas 的由来
后端·机器学习
专注搞钱20 分钟前
Python自动爬设备报警日志,每天省1小时
开发语言·python·半导体