为什么围棋中的作业要创建一个副本? [英] Why does assignment in Go create a copy?

查看:19
本文介绍了为什么围棋中的作业要创建一个副本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我会稍微澄清一下这个问题。我已经(几乎完全)阅读了围棋规范、常见问题、有效围棋,当然还有围棋巡回赛。

我知道围棋是一种传递价值的语言,我甚至设法对这种行为进行了推理,并理解了其中的所有含义。

围棋中的所有作业也会创建副本。在某些情况下,它只是一个值,在某些情况下--一个指针。对于某些数据结构,复制整个结构会比较棘手,并且可能包含指向另一个数据结构的隐式指针。

问题是:语言规范中有什么明确规定作业总是创建副本?

我觉得,一旦您了解Go中没有引用,就不需要再提它了,但规范中关于赋值语句的部分甚至没有提到按值传递的语义。

我觉得文档中一定有详细描述行为的东西,由于缺乏一些基础性的误解,我没有意识到那里有解释。

推荐答案

语言规范中明确规定赋值总是创建副本?

没有明确说明,但您可以从Variables中推断出来,这也很好地解决了函数签名的情况:

变量声明,或者对于函数参数和结果,函数声明或函数文本的签名为命名变量保留存储

如果存储是保留的,当您稍后将一元表达式的结果赋给它时-例如另一个变量-那么它必须是一个副本,否则就会有内存别名。这就是戴夫·切尼在There is no pass-by-reference in Go中所说的。

与C++不同,Go程序中定义的每个变量都占用唯一的内存位置。

这还有一个更重要的含义,即zero value。如果未在变量声明中提供用于初始化变量的表达式,则为其保留的存储空间将被赋予零值作为默认值。

这篇关于为什么围棋中的作业要创建一个副本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆