這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
GoLang 變數範圍
在 Golang 中,變數範圍分為:
本地局部變數
定義:在函數或者在語義塊(if/for等)中定義的變數
生效範圍:定義在函數裡面則在整個函數範圍有效; 定義在語義塊,則在整個語義塊生效
執行個體如下:
//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 訪問,全域變數以大寫開頭
//此處例子全域變數值為20var g intfunc test(){ a := 10 b := 10 //千萬不要使用 g := a+b 這個是在 main 裡面建立了一個新的局部變數 g g = a+b ...}//此處全域變數g1仍然為零值 0,而同名的局部變數 g1(:= 文法是定義一個新的變數且初始化) 為20var g1 intfunc test1(){ a := 10 b := 10 g1 := a + b}
參數變數
定義:函數調用時傳遞的變數
生效範圍:函數範圍(但是有可能會可變傳入參數的值,取決於傳遞的參數的類型)
//str 是參數變數//i 是局部變數//兩者區別:參數變數的賦值是在函數外部完成的(調用函數時);參數變數聲明後可以不使用,局部變數聲明不使用編譯錯誤//大部分情況下,參數變數和局部本地變數是一樣的func Test(str string){ i := 1}