for-loop - for 循环中的 Goroutine 只取 slice 的最后一个值
问题描述
谁能向我解释这种行为?
package main
import (
"fmt"
"time"
)
func main() {
a := []int64{1, 2, 3, 4, 5}
for _,v := range a {
go func(){
fmt.Println("value is ", v)
}()
}
time.Sleep(2*time.Second)
}
此代码打印以下输出。
value is 5
value is 5
value is 5
value is 5
value is 5
为什么没有传入参数时,goroutine 只取 slice 中的最后一个值?
编辑:我只想知道程序是如何执行的。每个 goroutine 都具有相同的值,但为什么它总是最后一个值?(疑问:goroutine 是不是只有在遍历 slice 中的所有元素后才会执行?)
解决方案
因为每个 goroutine 都持有相同的变量 v。如果你想获取 silce 的不同值,请这样做:
func main() {
a := []int64{1, 2, 3, 4, 5}
for _,v := range a {
v2 := v
go func(){
fmt.Println("value is ", v2)
}()
}
time.Sleep(2*time.Second)
}
输出是:
value is 1
value is 2
value is 3
value is 4
value is 5
推荐阅读
- machine-learning - 在机器学习中编码数字标称值
- javascript - 将对象转换为数组
- flutter - 双击底部导航栏项目 Flutter
- ios - 当我的 Mac 关闭时,React Native IOS 应用程序未从试飞中加载
- php - 产品购物车系统中的价格过滤器
- c++ - N个最佳匹配的OpenCV模板匹配不起作用
- python - 如何将 pytest 中的 cmdopts 传递给一个类?
- html - 阻止 url 转发仅包含应该是可见的
- android - 我想使用 instagram api 从 instagram 获取我的 android 项目的用户名
- python - 将列表从 Python 传递给 C,处理后列表值未更新