gpt4 book ai didi

go - 为什么我们需要在这里复制u的值?

转载 作者:行者123 更新时间:2023-12-01 22:06:43 24 4
gpt4 key购买 nike

我是Go语言的初学者,并且正在学习在线类(class),此处以这段代码为例:


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的内存模型如何解释此块吗?

注释:注释掉的内部功能是本讲座视频示例中使用的原始功能,但在本注释中进行了更改。在我看来,两者都是等效的,所以我想这个问题也适用于两者。

最佳答案

您正在使用的是闭包。 u2在内部函数及其周围的函数之间共享。这意味着随着u2的每次迭代被修改,修改后的值对于内部函数是可见的。更好的编写方式是使用已注释掉的代码。通过显式传递一个值到go例程,可以确保go例程携带自己的副本,而该副本不会被周围的函数修改。

规范对此说了什么:Go specification

Function literals A function literal represents an anonymous function.

FunctionLit = "func" Signature FunctionBody . func(a, b int, z float64) bool { return a*b < int(z) } A function literal can be assigned to a variable or invoked directly.

f := func(x, y int) int { return x + y } func(ch chan int) { ch <- ACK }(replyChan) Function literals are closures: they may refer to variables defined in a surrounding function. Those variables are then shared between the surrounding function and the function literal, and they survive as long as they are accessible.



希望这能回答您的问题。

关于go - 为什么我们需要在这里复制u的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61298178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com