首页 > 解决方案 > 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 中的所有元素后才会执行?)

标签: for-loopgoconcurrencygoroutine

解决方案


因为每个 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

推荐阅读