为何在迭代过程中频繁启用协程(Goroutine)会成为编程禁忌?
- 内容介绍
- 文章标签
- 相关推荐
本文共计779个文字,预计阅读时间需要4分钟。
gorange 变量被封闭,导致所有 goroutine 读取的是同一地址上的最终值。这并非不要用,而是不加处理就直接用,几乎必然出错。
为什么 for range 中直接起 goroutine 会打印错数据?
因为 Go 的 for 循环复用迭代变量(如 i 或 item),它在每次迭代中不创建新变量,只是更新同一块内存。而 goroutine 启动是异步的,往往等不到循环体执行完就已调度运行,此时变量早已变成最后一次迭代的值。
常见错误现象:
for i := 0; i 可能输出 <code>3 3 3,而非0 1 2- 爬虫中
for _, item := range items { go func() { send(item) }() }导致所有协程发的都是最后一个item
GoLand 会直接标红警告:Loop variable 'item' captured by func literal。
怎么传参才能让每个 goroutine 拿到正确的值?
核心原则:让值在启动 goroutine 时就被求值并绑定,而不是靠引用外部变量。
本文共计779个文字,预计阅读时间需要4分钟。
gorange 变量被封闭,导致所有 goroutine 读取的是同一地址上的最终值。这并非不要用,而是不加处理就直接用,几乎必然出错。
为什么 for range 中直接起 goroutine 会打印错数据?
因为 Go 的 for 循环复用迭代变量(如 i 或 item),它在每次迭代中不创建新变量,只是更新同一块内存。而 goroutine 启动是异步的,往往等不到循环体执行完就已调度运行,此时变量早已变成最后一次迭代的值。
常见错误现象:
for i := 0; i 可能输出 <code>3 3 3,而非0 1 2- 爬虫中
for _, item := range items { go func() { send(item) }() }导致所有协程发的都是最后一个item
GoLand 会直接标红警告:Loop variable 'item' captured by func literal。
怎么传参才能让每个 goroutine 拿到正确的值?
核心原则:让值在启动 goroutine 时就被求值并绑定,而不是靠引用外部变量。

