Я новичок в 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 интерпретирует этот блок?
Примечание : закомментированная внутренняя функция была оригинальной, использованной в примере в видео лекции, но была изменена в лекции. Мне кажется, что оба эквивалентны, так что я думаю, что вопрос относится к обоим.