在这个片段中 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
收到一只叮咚
TA贡献1821条经验 获得超4个赞
这是一个难对付的人群。我正在寻找的答案基本上是在声明中:
list := repeat(list)
内部列表变量在语句结束之前不在范围内,而外部列表变量在范围内。这是规范必须说的:
Go 使用块进行词法作用域:
预先声明的标识符的范围是 Universe 块。表示在顶层(任何函数之外)声明的常量、类型、变量或函数(但不是方法)的标识符的范围是包块。导入包的包名的范围是包含导入声明的文件的文件块。表示方法接收器、函数参数或结果变量的标识符的范围是函数体。在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(短变量声明的 ShortVarDecl)的末尾开始,并在最里面的包含块的末尾结束。 在函数内声明的类型标识符的范围从 TypeSpec 中的标识符开始,并在最里面的包含块的末尾结束。
突出显示的文本是我在第一次阅读时遗漏的操作原理。我的罪过。:-)
- 2 回答
- 0 关注
- 222 浏览
添加回答
举报
0/150
提交
取消