這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
先舉個栗子,全域範圍變數,與 := 標記法宣告賦值新變數
package mainimport "fmt"var a = "GG"func main() { n() m() n()}func n() { fmt.Println(a)}func m() { // 對於 := 定義的變數,新變數a與全域已定義的a變數同名,不在一個範圍 //所以golong定義新的變數a。遮住全域變數a,所以m()列印"66" a := "66" fmt.Println(a)}
局部變數
在函數體內聲明的變數稱之為局部變數,它們的範圍只在函數體內,參數和傳回值變數也是局部變數。
以下執行個體中 main() 函數使用了局部變數 a, b, c:
package mainimport "fmt"func main() { /* 聲明局部變數 */ var a, b, c int /* 初始化參數 */ a = 10 b = 20 c = a + b fmt.Printf ("結果: a = %d, b = %d and c = %d\n", a, b, c)}局部變數聲明
全域變數
在函數體外聲明的變數稱之為全域變數,全域變數可以在整個包甚至外部包(被匯出後)使用。
全域變數可以在任何函數中使用,以下執行個體示範了如何使用全域變數:
package mainimport "fmt"/* 聲明全域變數 */var g intfunc main() { /* 聲明局部變數 */ var a, b int /* 初始化參數 */ a = 10 b = 20 //調用全域變數聲明的g g = a + b fmt.Printf("結果: a = %d, b = %d and g = %d\n", a, b, g)}全域變數引用
Go 語言程式中全域變數與局部變數名稱可以相同,但是函數內的局部變數會被優先考慮。執行個體如下:
package mainimport "fmt"/* 聲明全域變數 */var g int = 20func main() { /* 聲明局部變數 */ var g int = 10 fmt.Printf ("結果: g = %d\n", g)}//結果是g = 10 ,優先考慮局部變數
形式參數
形式參數會作為函數的局部變數來使用。
package mainimport "fmt"/* 聲明全域變數 */var a int = 20;func main() { /* main 函數中聲明局部變數 */ var a int = 10 var b int = 20 var c int = 0 fmt.Printf("main()函數中 a = %d\n", a); c = sum( a, b); fmt.Printf("main()函數中 c = %d\n", c);}/* 函數定義-兩數相加 */func sum(a, b int) int { fmt.Printf("sum() 函數中 a = %d\n", a); fmt.Printf("sum() 函數中 b = %d\n", b); return a + b;}形式參數
初始化局部和全域變數
不同類型的局部和全域變數預設值為:
| 資料類型 |
初始化預設值 |
| int |
0 |
| float32 |
0 |
| pointer |
nil |