2015-11-20 102 views
2

我有點新的Go語言,並想知道爲什麼下面的一段代碼不工作;GoLang變量在for循環undefined外

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循環的範圍之外),但作爲一個PHP/JS開發人員,我不習慣這個,並會說變量在for循環之後也可用。

如何從該點訪問該變​​量?基本上只顯示最後生成的字符串。

回答

2

請參閱從規範的相關部分:Declarations and scope

函數內聲明恆定或可變標識符的範圍開始於常量實現或VarSpec的端部(ShortVarDecl簡稱變量聲明)和結束於最內層包含塊的末端。

定義它在您要訪問它的範圍:for之前(在main()功能的範圍)。

另請注意,fmt.Sprintf()除了要打印的參數之外還需要其他參數:格式字符串。請提供一個格式字符串(例如,包含參數randomString%s動詞),或者您可以使用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

+0

啊!這很明顯,我沒有看到它。太好了,謝謝:) –

+0

事實上,我忘了格式化字符串中的%s。但是,Println也適用於此。 –

1

這是範圍問題,在Go範圍內randomString是循環體,在JS中它將是整個函數。範圍規則在不同的語言中有所不同。

檢查圍棋規格:

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

+0

謝謝,但我在提問之前查看了該頁面 - 它沒有爲我清除任何事情。我知道我有問題,所以我就問爲什麼。 –

+0

@RobQuist這種情況下的相關部分是「在函數內聲明的常量或變量標識符的範圍從ConstSpec或VarSpec(ShortVarDecl用於簡短變量聲明)的末尾開始,並在最內層包含塊的末尾處結束「。 – chill

+0

啊,我看到它上面提到.. – chill