變量(Variable)是程序運(yùn)行過(guò)程中,內(nèi)容可以變化(修改)的量,變量的功能是存儲(chǔ)用戶(hù)的數(shù)據(jù),是計(jì)算機(jī)語(yǔ)言中能儲(chǔ)存計(jì)算結(jié)果或能表示值抽象概念。
變量,是通過(guò)變量的標(biāo)識(shí)符定位值的過(guò)程。變量的內(nèi)存模擬演示:
目前創(chuàng)新互聯(lián)已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、綿陽(yáng)服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計(jì)、網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶(hù)導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶(hù)和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。我們擁有完善的網(wǎng)絡(luò)基礎(chǔ)設(shè)施服務(wù),能夠?yàn)槠髽I(yè)或個(gè)人提供空間域名、虛擬空間、企業(yè)郵局、網(wǎng)站加速、數(shù)據(jù)庫(kù)、云主機(jī)等網(wǎng)絡(luò)基礎(chǔ)服務(wù)。
定義變使用var關(guān)鍵字,需要指定其類(lèi)型,可以同時(shí)初始化,如果沒(méi)有指定初始化值,則使用類(lèi)型的默認(rèn)值,語(yǔ)法如下:
// 聲明變量,未初始化(默認(rèn)值初始化)
var name string
// 聲明變量,特定值初始化
var user string = "Hank"
Go語(yǔ)言中的變量必須聲明后才可以使用,不能直接使用未定義的變量。
Go語(yǔ)言的類(lèi)型默認(rèn)值如下所示:
Go語(yǔ)言是強(qiáng)類(lèi)型語(yǔ)言,變量必須有類(lèi)型,同時(shí)變量?jī)H僅可以存儲(chǔ)特定類(lèi)型的數(shù)據(jù)。
定義變量時(shí),如果指定了初始值,則可以省略類(lèi)型的定義,Go語(yǔ)言可以自己由數(shù)據(jù)推導(dǎo)出類(lèi)型。
語(yǔ)法為:
// 聲明變量,特定值初始化,類(lèi)型推導(dǎo)出user為字符串string型
var user = "Hank"
為了簡(jiǎn)化定義變量,使用運(yùn)算符 := 配合類(lèi)型推導(dǎo),可以快速完成變量的定義,語(yǔ)法為:
user := "hank"
使用var或:=都可以一次性定義多個(gè)變量,語(yǔ)法為:
var
var (
v1 = 42
v2 = "hank"
)
也可以
var v1, v2 = 42, "hank"
:=
v1, v2 := 42, "hank"
推薦使用 var() 聲明塊語(yǔ)法,因?yàn)榇a維護(hù)容易。
一次性為多個(gè)變量進(jìn)行賦值。(類(lèi)似短定義。v1, v2, v3 := 42, "hank", false)
當(dāng)變量定義完畢后,再批量對(duì)其賦值,沒(méi)有定義功能!
語(yǔ)法為:
var (
v1 int
v2 int
)
// 批量賦值
v1, v2 = 42, 1024
該語(yǔ)法,通常配合函數(shù)的批量返回來(lái)使用,一次性接收多個(gè)返回值,語(yǔ)法為:
func main() {
var (
v1 int
v2 int
)
// 調(diào)用函數(shù),接收其返回值
v1, v2 = getData()
}
// 返回兩個(gè)值的函數(shù)
func getData() (int, int) {
// 返回了兩個(gè)值(假設(shè)42為最小值,1024為最大值)
return 42, 1024
}
非常方便的可以交換兩個(gè)變量的值:
var (
v1 = 42
v2 = 1024
)
// 交換
v1, v2 = v2, v1
執(zhí)行后,v1==1024, v2==42
標(biāo)識(shí)符為_(kāi)(下劃線(xiàn))的變量,是系統(tǒng)保留的匿名變量,在賦值后,會(huì)被立即釋放,稱(chēng)之為匿名變量。其作用是變量占位符,對(duì)其變量賦值結(jié)構(gòu)。通常會(huì)在批量賦值時(shí)使用。
例如,函數(shù)返回多個(gè)值,我們僅僅需要其中部分,則不需要的使用_來(lái)占位,演示:
func main() {
var (
v int
)
// 調(diào)用函數(shù),僅僅需要第二個(gè)返回值,第一,三使用匿名變量占位
_, v, _ = getData()
}
// 返回兩個(gè)值的函數(shù)
func getData() (int, int, int) {
// 返回3個(gè)值
return 42, 1024, 2012
}
Go語(yǔ)言中的變量是塊作用域。
塊,指的是使用{}定義的代碼段,包括函數(shù),if/switch/for語(yǔ)句,或獨(dú)立的{}都是塊。在塊內(nèi)定義的變量?jī)H僅在本塊內(nèi)可用。
定義,指的是 var 或者 := 定義的變量。
Go語(yǔ)言的作用域是層疊的,就是說(shuō)內(nèi)層塊可以直接訪(fǎng)問(wèn)到外層塊的變量,前提是內(nèi)層塊沒(méi)有定義同名的外層變量。
演示如下:
// 全局(函數(shù)外)定義3個(gè)變量
var (
v1 = 1
v2 = 2
v3 = 3
)
func main() {
// main{}函數(shù)塊,定義2個(gè)變量
var (
v2 = 22
v3 = 33
)
fmt.Println(v1, v2, v3)
// 結(jié)果 1 22 33
{
// main()函數(shù)內(nèi)部{}塊,定義1個(gè)變量
var (
v3 = 333
)
fmt.Println(v1, v2, v3)
// 結(jié)果 1 22 333
}
}
上面代碼中:
在main()中,v2,v3被重新定義,則在main()中,v1是外部,而v2, v3是main函數(shù)局部的。
在main()內(nèi)部的{}中,v3被重新定義,則在main()內(nèi)部的{}中,v1是外部,而v2是main()定義的, v3是main()內(nèi)部{}定義的的。
變量可以沿內(nèi)部作用域向外部作用域查找變量的過(guò)程。
帶有{}的語(yǔ)句,其中的變量也僅僅在內(nèi)部有效,例如for,if,switch等,演示:
for i := 0; i < 10; i++ {
fmt.Println(i)
}
fmt.Println(i)
// 會(huì)提示變量i未定義, undefined: i
注意i,是通過(guò)短聲明在for內(nèi)部定義的變量,僅僅在for內(nèi)部有意義。
互不嵌套的{}見(jiàn)作用域不可見(jiàn),不可互相訪(fǎng)問(wèn)。
func main() {
{
v := 42
}
{
fmt.Println(v)
// 會(huì)提示變量v未定義, undefined: v
}
}
完!
原文出自:小韓說(shuō)課
微信關(guān)注:小韓說(shuō)課