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)

}

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

相关推荐
进击的前栈37 分钟前
鸿蒙原生开发手记:徒步迹 - 文件读写与缓存管理
后端
布朗克16839 分钟前
Go入门到精通-22-同步原语
开发语言·后端·golang·同步原语
云上小朱39 分钟前
在docker环境部署Alist3.62.0
后端
wei_shuo40 分钟前
KES 事务管理与MVCC深度解析:隔离级别、快照机制与并发控制
后端
程序员清风44 分钟前
公司要裁员之前,都会有哪些信号?
java·后端·面试
帅次1 小时前
Kotlin Flow 与 StateFlow:UI 单向数据流基础
开发语言·ui·kotlin·stateflow·onlifecycle
AskHarries1 小时前
Stripe 集成教程
后端
65岁退休Coder1 小时前
LangChain v1.3.4 笔记 - 03 Agent 的 model、tools、response_format 及 stream 输出
后端
艾伦野鸽ggg1 小时前
JavaScript 浏览器本地存储
开发语言·javascript·ecmascript
饼干哥哥1 小时前
n8n 又活了?用 Codex把跨境电商工作流转成 Skill
人工智能·后端·代码规范