Golang阴影行为解释

时间:2015-11-06 17:08:33

标签: go

在此代码段中

    list := []string{"a", "b", "c"}
    for {
        list := repeat(list)
...

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

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

2 个答案:

答案 0 :(得分:4)

Go is lexically scoped using blocks。在这个例子中:

list := []string{"a", "b", "c"}
for {
    list := repeat(list)

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

因为list的参数是在声明和分配内部repeat之前评估的,list会从外部var raw = "xFCx40xFF" var end = raw.length-2; var i = 1; var j = 0; var myArray = new Uint8Array(raw.len); while (i < end) { var s = raw.substr(i,2); var num = parseInt(s,16); i += 3; myArray[j] = num; j += 8; } 接收值

答案 1 :(得分:0)

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

list := repeat(list)

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

  

Go使用块进行词法作用:

     

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

突出显示的文字是我在第一次阅读中遗漏的操作原理。 Mea culpa。 : - )