兽医抱怨func文字捕获了循环变量

时间:2019-12-20 20:53:21

标签: go

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

1 个答案:

答案 0 :(得分:5)

这是一行:

fmt.Printf("employee %d received signal %d\n", i, rcv)

在此,使用emp代替i。您正在将循环变量作为emp传递给goroutine,但是您似乎忘记了使用它。