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