为了账号安全,请及时绑定邮箱和手机立即绑定

Golang阴影行为解释

Golang阴影行为解释

Go
富国沪深 2021-11-22 14:52:42
在这个片段中    list := []string{"a", "b", "c"}    for {        list := repeat(list)...    func repeat(list []string) []string {...很明显,list用作repeat()函数参数的变量是外部的阴影列表变量。现在我的问题是,Go 语言律师将如何解释这种行为?乍一看,我认为内部列表变量的声明应该在repeat(list)表达式计算之前。
查看完整描述

2 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

Go 使用 blocks 进行词法作用域。在这个例子中:


list := []string{"a", "b", "c"}

for {

    list := repeat(list)

第二个list隐藏 for 块中的第一个,并且不会改变外部list变量。


因为在声明和分配repeat内部之前评估参数list,repeat所以从外部接收值list


查看完整回答
反对 回复 2021-11-22
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

这是一个难对付的人群。我正在寻找的答案基本上是在声明中:

list := repeat(list)

内部列表变量在语句结束之前不在范围内,而外部列表变量在范围内。这是规范必须说的:

Go 使用块进行词法作用域:

预先声明的标识符的范围是 Universe 块。表示在顶层(任何函数之外)声明的常量、类型、变量或函数(但不是方法)的标识符的范围是包块。导入包的包名的范围是包含导入声明的文件的文件块。表示方法接收器、函数参数或结果变量的标识符的范围是函数体。在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(短变量声明的 ShortVarDecl)的末尾开始,并在最里面的包含块的末尾结束。 在函数内声明的类型标识符的范围从 TypeSpec 中的标识符开始,并在最里面的包含块的末尾结束。

突出显示的文本是我在第一次阅读时遗漏的操作原理。我的罪过。:-)


查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信