Golang阴影行为解释

在这个片段中


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

    for {

        list := repeat(list)

...


    func repeat(list []string) []string {

...

很明显,list用作repeat()函数参数的变量是外部的阴影列表变量。现在我的问题是,Go 语言律师将如何解释这种行为?乍一看,我认为内部列表变量的声明应该在repeat(list)表达式计算之前。


富国沪深
浏览 231回答 2
2回答

holdtom

Go 使用 blocks 进行词法作用域。在这个例子中:list := []string{"a", "b", "c"}for {    list := repeat(list)第二个list隐藏 for 块中的第一个,并且不会改变外部list变量。因为在声明和分配repeat内部之前评估参数list,repeat所以从外部接收值list

收到一只叮咚

这是一个难对付的人群。我正在寻找的答案基本上是在声明中:list := repeat(list)内部列表变量在语句结束之前不在范围内,而外部列表变量在范围内。这是规范必须说的:Go 使用块进行词法作用域:预先声明的标识符的范围是 Universe 块。表示在顶层(任何函数之外)声明的常量、类型、变量或函数(但不是方法)的标识符的范围是包块。导入包的包名的范围是包含导入声明的文件的文件块。表示方法接收器、函数参数或结果变量的标识符的范围是函数体。在函数内声明的常量或变量标识符的范围从 ConstSpec 或 VarSpec(短变量声明的 ShortVarDecl)的末尾开始,并在最里面的包含块的末尾结束。 在函数内声明的类型标识符的范围从 TypeSpec 中的标识符开始,并在最里面的包含块的末尾结束。突出显示的文本是我在第一次阅读时遗漏的操作原理。我的罪过。:-)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go