【发布时间】:2020-11-09 17:47:14
【问题描述】:
我在 go 中有一个代码 sn-p:
for _, u := range urls {
done.Add(1)
u2 := u
go func() {
defer done.Done()
ConcurrentMutex(u2, fetcher, f)
}()
//go func(u string) {
// defer done.Done()
// ConcurrentMutex(u, fetcher, f)
//}(u)
}
为了让ConcurrentMutex 看到不同的u 值,需要使用中间变量u2 或使用注释掉的代码。如果我只是这样做:
for _, u := range urls {
done.Add(1)
go func() {
defer done.Done()
ConcurrentMutex(u, fetcher, f)
}()
}
我很困惑为什么它的行为与注释掉的代码的行为不同。 Go 是按值传递的,当我将u 传递给ConcurrentMutex 时,它不应该只是复制当前u 的值,从而不受以后对u 所做的更改吗?
【问题讨论】:
-
是的,参数总是按值传递,但你不知道何时评估参数,因为它同时发生在循环中。对于这么短的循环,很可能(但不能保证!)所有 ConcurrentMutex 调用都发生在循环长时间完成之后。
标签: go concurrency