【发布时间】:2021-10-12 04:41:27
【问题描述】:
我会稍微澄清一下这个问题。我已经(几乎完全)阅读了围棋规范、常见问题解答、有效围棋,当然还有围棋之旅。
我知道 Go 是一种“按值传递”的语言,甚至设法推理这种行为并理解所有含义。
Go 中的所有作业也会创建副本。在某些情况下,它只是一个值,在某些情况下——一个指针。对于某些数据结构,它有点棘手,因为整个结构被复制并且可能包含指向另一个数据结构的隐式指针。
问题是:语言规范中有什么明确规定分配总是创建副本?
一旦你明白 Go 中没有引用,我觉得它甚至不需要提及,但是规范中关于赋值语句的部分甚至没有提到按值传递的语义。
我觉得文档中必须有一些内容详细描述了该行为,并且由于缺乏一些基本的误解,我没有意识到那里的解释。
【问题讨论】:
-
也许混淆来自将“按值传递”和“复制”混为一谈。 Go 是按值传递,这比“复制”这个非常宽泛的术语要简单得多。
-
例如,FAQ 文档中说“一个函数总是得到一个被传递的东西的副本,就好像有一个赋值语句将值分配给参数一样”。这涵盖了函数调用的行为,但根本没有描述赋值本身。我只是想知道这是否太明显而无法详细记录,或者我在文档中遗漏了一些东西
-
您能否进一步解释为什么某些数据结构在复制方面“有点棘手”?
-
我可能使用了错误的措辞。我的意思是需要时间来理解切片,复制的是切片头。这里没有什么棘手的问题,只需阅读有关切片和映射如何实现的官方博客文章即可。不过,这与我的问题无关:)
-
Why does assignment in Go create a copy?严格来说,设计决策。认为你的问题的标题更好,where in the spec does it mention that the language passes by value;
标签: go variable-assignment pass-by-value