在 Golang 中,變量做用域分爲:函數
定義:在函數或者在語義塊(if/for等)中定義的變量
生效範圍:定義在函數裏面則在整個函數範圍有效; 定義在語義塊,則在整個語義塊生效code
實例以下:作用域
//str 定義在函數內,所以它是一個本地局部變量 //str 僅僅在 Test函數內有效,出了這個函數無效 func Test(){ str := "This is a local var" } // str1 定義在語義塊 for 裏面,所以它也是一個本地局部變量 // str1 僅僅在 for 循環語句裏面生效,出了這個語義塊不可見 func Test1(){ for{ str1 := "This is yet a local var in block" ... } } //if 語義塊輸出 "block var"; 末尾輸出 "local var" //注意做用域的優先級(當變量名相同時,會優先使用當前做用域的變量) func Test2(){ str := "local var" if true { str := "block var" fmt.Println(str) } fmt.Println(str) }
定義:函數外部定義的變量都屬於全局變量;全局變量聲明必須以 var 開頭
生效範圍:當前 package 內,若是想要其餘 package 訪問,全局變量以大寫開頭string
//此處例子全局變量值爲20 var g int func test(){ a := 10 b := 10 //千萬不要使用 g := a+b 這個是在 main 裏面建立了一個新的局部變量 g g = a+b ... } //此處全局變量g1仍然爲零值 0,而同名的局部變量 g1(:= 語法是定義一個新的變量且初始化) 爲20 var g1 int func test1(){ a := 10 b := 10 g1 := a + b }
定義:函數調用時傳遞的變量
生效範圍:函數範圍(可是有可能會可變傳入參數的值,取決於傳遞的參數的類型)編譯
//str 是參數變量 //i 是局部變量 //二者區別:參數變量的賦值是在函數外部完成的(調用函數時);參數變量聲明後能夠不使用,局部變量聲明不使用編譯錯誤 //大部分狀況下,參數變量和局部本地變量是同樣的 func Test(str string){ i := 1 }