我在作为 goroutines 运行的函数中看到不正确的值。除非复制到新变量中,否则它们似乎不会从调用它们的范围中捕获值。
http://play.golang.org/p/YZYi-IVuYm
对比
最佳答案
您要么需要在本地上下文中重新分配变量,以便闭包可以捕获值:
http://play.golang.org/p/-NO4S4qCZf
package main
import "fmt"
import "time"
func main() {
l := []int{1, 2, 3}
for idx, item := range l {
theIdx, theItem := idx, item
go func() {
fmt.Println(theIdx, theItem)
}()
}
time.Sleep(time.Second)
}
或者您将值传递给 goroutine 并向函数添加参数
http://play.golang.org/p/5gNToDWSQR
package main
import "fmt"
import "time"
func main() {
l := []int{1, 2, 3}
for idx, item := range l {
go func(idx, item int) {
fmt.Println(idx, item)
}(idx, item)
}
time.Sleep(time.Second)
}
关于go - 除非变量被复制,否则 go 例程中的闭包具有不正确的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24196200/