在此代码段中
list := []string{"a", "b", "c"}
for {
list := repeat(list)
...
func repeat(list []string) []string {
...
很明显,用作list
函数参数的repeat()
变量是外部阴影列表变量。现在我的问题是,Go语言律师将如何解释这种行为?乍一看,我认为内部列表变量的声明将先于repeat(list)
表达式评估。
答案 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。 : - )