先決條件:Go 語言變量
變量的作用域可以定義為可訪問特定變量的程序的一部分??梢栽陬悾椒?,循環(huán)等中定義變量。像C / C ++一樣,在Golang中,所有的標識符都是詞法(或靜態(tài))作用域,即變量的作用域可以在編譯時確定?;蛘吣憧梢哉f一個變量只能從定義它的代碼塊中調用。
Golang變量的范圍規(guī)則可以分為兩類,具體取決于聲明變量的位置:
局部變量(在塊或函數(shù)內部聲明)
全局變量(在塊或函數(shù)外部聲明)
在函數(shù)或塊中聲明的變量稱為局部變量。這些不能在函數(shù)或塊之外訪問。
這些變量也可以在函數(shù)內的for,while語句等內部聲明。
但是,這些變量可以由函數(shù)內的嵌套代碼塊訪問。
這些變量也稱為塊變量。
如果在同一作用域中用相同的名稱聲明兩次這些變量,則會出現(xiàn)編譯時錯誤。
函數(shù)執(zhí)行結束后,這些變量將不存在。
在循環(huán)外聲明的變量也可以在嵌套循環(huán)內訪問。這意味著方法和所有循環(huán)都可以訪問全局變量。局部變量可被循環(huán)訪問,并在該函數(shù)內執(zhí)行函數(shù)。
在循環(huán)體內聲明的變量對循環(huán)體外不可見。
//局部變量 package main import "fmt" //主函數(shù) func main() { //從這里開始主函數(shù)的局部作用域 //主函數(shù)內的局部變量 var myvariable1, myvariable2 int = 69, 145 // 顯示變量的值 fmt.Printf("myvariable1 變量的值 : %d\n", myvariable1) fmt.Printf("myvariable2 變量的值 : %d\n", myvariable2) } // 此處主要函數(shù)的局部作用域結束
輸出:
myvariable1 變量的值 : 69 myvariable2 變量的值 : 145
在函數(shù)或塊之外定義的變量稱為全局變量。
這些在程序的整個生命周期中都可用。
這些在所有函數(shù)或塊之外的程序頂部聲明。
這些可以從程序的任何部分進行訪問。
//全局變量 package main import "fmt" // 全局變量聲明 var myvariable1 int = 100 func main() { // 主函數(shù)內部的局部變量 var myvariable2 int = 200 //顯示全局變量 fmt.Printf("全局變量 myvariable1 的值是 : %d\n", myvariable1) //顯示局部變量 fmt.Printf("局部變量 myvariable2 的值是 : %d\n", myvariable2) //調用函數(shù) display() } func display() { // 顯示全局變量 fmt.Printf("全局變量 myvariable1 的值是 : %d\n", myvariable1) }
輸出:
全局變量 myvariable1 的值是 : 100 局部變量 myvariable2 的值是 : 200 全局變量 myvariable1 的值是 : 100
注意:如果函數(shù)中存在與全局變量同名的局部變量,將會發(fā)生什么情況?
答案很簡單,即編譯器將優(yōu)先選擇局部變量。通常,當定義了兩個具有相同名稱的變量時,編譯器會產生編譯時錯誤。但是,如果變量在不同的范圍內定義,則編譯器會允許它。只要定義了與全局變量同名的局部變量,編譯器就會優(yōu)先考慮該局部變量。
示例:在下面的程序中,您可以清楚地看到輸出。由于myvariable1的值為200,這在函數(shù)main中給出。因此,可以說局部變量比全局變量具有更高的優(yōu)先級。
//Go程序顯示編譯器的優(yōu)先級 //全局變量上的局部變量 package main import "fmt" //全局變量聲明 var myvariable1 int = 100 func main() { //主函數(shù)內的局部變量 //與全局變量相同 var myvariable1 int = 200 // 顯示 fmt.Printf("變量 myvariable1 的值是 : %d\n", myvariable1) }
輸出:
變量 myvariable1 的值是 : 200