我是 Go 的初学者,正在学习以这段代码为例的在线课程:
func ConcurrentMutex(url string, fetcher Fetcher, f *fetchState) {
var done sync.WaitGroup
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)
}
done.Wait()
return
}
u 的类型是字符串,在我看来,我们应该能够将 u 传递给内部函数中的 ConcurrentMutex 调用,而无需将其值复制到 u2。然而,教授坚持认为,Go 内存模型意味着当我们不断改变 u 的值时,它会影响对 ConcurrentMutex 的不同调用。
我仍然不完全确定为什么。调用函数时的 u 值不应该传递给函数吗?如果我们传递一个指针,我会理解的,但因为我们不是,这让我感到困惑。
有人可以解释一下 Go 的内存模型是如何解释这个块的吗?
注意:注释掉的内部函数是讲座视频中示例中使用的原始函数,但在讲座笔记中进行了更改。在我看来两者都是等价的,所以我想这个问题适用于两者。
喵喵时光机
相关分类