GoLang变量in for循环未定义在

时间:2015-11-20 09:30:52

标签: go scope

我是Go语言的新手,并想知道为什么下面的代码无效;

package main

import (
    "fmt"
)

func main() {
    for i := 0; i < 10000; i++ {
        var randomString = fmt.Sprintf("a%sa\n", "test")
    }
    fmt.Printf("Made 10000 random strings like", randomString);
}

我删除了一些不相关的代码(因为这显然不是随机的)。

我遇到的问题是,在for循环中,“randomString”未定义。

我尝试使用randomString := fmt.Sprintf()和您在上面看到的var进行设置。

我很确定这是一个范围问题(randomString变量不在for-loop之外的范围内),但作为一个PHP / JS开发人员,我不习惯这个并且会说这个变量也可以在for循环之后使用。

如何从该点访问该变​​量?基本上只显示最后生成的字符串。

2 个答案:

答案 0 :(得分:7)

请参阅规范中的相关部分:Declarations and scope

  

在函数内声明的常量或变量标识符的范围从ConstSpec或VarSpec(短变量声明的ShortVarDecl)结束开始,在最内层包含块的末尾结束。< / p>

在您要访问它的范围内定义它:在for之前(在main()函数的范围内)。

另请注意,fmt.Sprintf()除了要打印的参数外还需要一个额外的参数:格式字符串。提供格式字符串(例如,包含%s参数的randomString动词),或者您可以使用fmt.Sprintln()

func main() {
    var randomString string
    for i := 0; i < 10000; i++ {
        randomString = fmt.Sprintf("a%sa\n", "test")
    }
    fmt.Println("Made 10000 random strings like", randomString)
}

输出:

Made 10000 random strings like atesta

Go Playground上尝试。

答案 1 :(得分:2)

这是范围问题,在Go randomString的范围是循环体,在JS中它将是整个函数。范围规则在不同语言中有所不同。

检查Go规范:

https://golang.org/ref/spec#Declarations_and_scope