go github的page中记录的常见新手错误之一是忽略将循环变量作为参数传递给goroutine(在这种情况下,鉴于以下情况,程序的输出可能会不一致:
很有可能在运行此代码时您会看到 每次迭代打印的最后一个元素,而不是每个值 序列,因为goroutine可能不会开始执行 直到循环结束。
因此,所提出的解决方案(如上所述)是将实际的循环变量作为goroutine参数传递:
library(data.table)
library(stringr)
setDT(df1)[, `:=`(c("Status", "output2"), {
Status <- ordered(Status, levels = c("OD", "O", "Completed"))
output2 <- str_c(first(levels(droplevels(Status))), ": ", toupper(group))
.(Status, output2)
}), by = .(group, id)]
df1
# ï..task Status id group output output2
# 1: a O 123 zzz OD: ZZZ OD: ZZZ
# 2: b OD 123 zzz OD: ZZZ OD: ZZZ
# 3: c Completed 123 zzz OD: ZZZ OD: ZZZ
# 4: d O 123 xxx O: XXX O: XXX
# 5: a OD 456 zzz OD: ZZZ OD: ZZZ
# 6: b Completed 456 zzz OD: ZZZ OD: ZZZ
# 7: c O 456 zzz OD: ZZZ OD: ZZZ
# 8: d OD 456 xxx OD: XXX OD: XXX
# 9: a Completed 789 zzz O: ZZZ O: ZZZ
# 10: b O 789 zzz O: ZZZ O: ZZZ
# 11: c O 789 zzz O: ZZZ O: ZZZ
# 12: d Completed 789 xxx Completed: XXX Completed: XXX
那我的for _, val := range values {
go func(val interface{}) {
fmt.Println(val)
}(val)
}
为什么扔给我
我被函数文字捕获的循环变量
使用以下代码?
go-vet
答案 0 :(得分:5)
这是一行:
fmt.Printf("employee %d received signal %d\n", i, rcv)
在此,使用emp
代替i
。您正在将循环变量作为emp
传递给goroutine,但是您似乎忘记了使用它。