go語言變量有2種作用域:1、局部變量,是在函數(shù)級別和塊級別內(nèi)聲明的變量;局部變量只能在它們的塊或函數(shù)中訪問,已經(jīng)聲明的局部變量不能在同一塊或函數(shù)中重新聲明。2、全局變量,是在包級別聲明的變量;全局變量在程序的整個生命周期中都可用,不能使用“:=”運算符聲明全局變量。
本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。
變量聲明的位置
Go語言變量聲明的位置有三種級別:
- 包(package)級別:變量在函數(shù)外聲明
- 函數(shù)級別:變量在函數(shù)內(nèi),包括函數(shù)的傳參參數(shù)變量,但在代碼塊外聲明
- 塊級別:這個分兩種,一種是顯式,會使用大括號{}括起來的代碼;另一種是隱式,如for,if后的初始化表達(dá)式。
變量位置示例
package main import "fmt" var test = "test" //在函數(shù)外,包級別變量 func main() { a, b := 1, 2 //a和b,c在main函數(shù)內(nèi)定義,函數(shù)級別變量 c := sum(a, b) fmt.Println(c) fmt.Println(test) for i := 0; i < 10; i++ { //i為for循環(huán)內(nèi)定義,為隱式塊級別變量 var d = i + 1 //d在for的循環(huán)體內(nèi),以大括號{}括起來,為顯式塊級別變量 fmt.Println(d) } } func sum(a, b int) int { //函數(shù)參數(shù)a和b,在函數(shù)內(nèi)定義,為函數(shù)級別變量 fmt.Println(a) fmt.Println(b) nu := a + b return nu }
登錄后復(fù)制
變量作用域
變量聲明的位置決定了變量允許在什么地方被訪問以及變量的聲明周期。變量的可訪問范圍稱為變量的作用域。Go語言中,變量的作用域分為兩類:
- 局部變量,也稱為本地變量
- 全局變量
局部變量
在函數(shù)級別和塊級別內(nèi)聲明的變量為局部變量。局部變量有以下特征:
- 局部變量只能在它們的塊或函數(shù)中訪問。
- 局部變量的生命周期只到塊或聲明它們的函數(shù)的末尾。之后,它們被垃圾回收器回收。
- 已經(jīng)聲明的局部變量,不能在同一塊或函數(shù)中重新聲明。
示例:
package main import "fmt" func main() { var a= "astrng" fmt.Println(a) for i := 0; i < 10; i++ { fmt.Println(i) } fmt.Println(i) } func testLocal() { fmt.Println(a) }
登錄后復(fù)制
這個代碼編譯時會報錯:
undefined: i undefined: a
登錄后復(fù)制
原因:
i:為for循環(huán)體內(nèi)的塊級別的局部變量,在定義它的for循環(huán)體外訪問,就會報undefined。
a:為main函數(shù)級別的局部變量,在testLocal函數(shù)內(nèi)無法訪問,會報undefined錯誤。
全局變量
在包級別聲明的變量為全局變量。全局變量有以下特征:
- 全局變量以小寫開頭時,此全局變量只能在定義它的包(package)內(nèi)使用。即變量在包內(nèi)可見。
- 全局變量以大寫開頭時,此全局變量可以跨不同包(package)之間使用。即變量在所有地方可見。
- 全局變量在程序的整個生命周期中都可用。
- 不能使用
:=
運算符聲明全局變量。
package main import "fmt" var a = "astring" func main() { testGlobal() } func testGlobal() { fmt.Println(a) //運行結(jié)果是,正確打印出a的值“astring” }
登錄后復(fù)制
局部變量和全局變量同名
Go語言程序中全局變量與局部變量名稱可以相同,但是函數(shù)體內(nèi)的局部變量會被優(yōu)先考慮。
package main import "fmt" //聲明全局變量 var a float32 = 3.14 func main() { //聲明局部變量 var a int = 3 fmt.Printf("a = %dn", a) }
登錄后復(fù)制
運行結(jié)果如下所示:
a = 3
登錄后復(fù)制
Go語言是運行局部變量和全局變量同名,同名的變量在局部作用域范圍,它將遮蔽外部作用域中的變量。
package main import "fmt" var a = "globala" func main() { var a = "locala" fmt.Println(a) //此處的a會遮蔽外面定義的a全局變量,輸出locala } func testGlobal() { fmt.Println(a) //此處是全局變量a,輸出globala }
登錄后復(fù)制
【