課程要點(diǎn)
- 了解Golang中的變量的使用
- 了解Golang中的常量的使用
- 了解變量和常量的可訪問(wèn)性
變量
定義變量
Golang是一門十分簡(jiǎn)約的語(yǔ)言,它的變量定義與其他主流語(yǔ)言有一定的相似之處,但是卻沒有像其他語(yǔ)言一樣擁有很多可選的修飾符。
在Golang的變量定義中,我們只會(huì)用到var這一個(gè)修飾符,并且在多數(shù)情況下var關(guān)鍵字也是可以直接省略的,
從中我們也可以直觀的感受到Golang設(shè)計(jì)上的簡(jiǎn)約原則。
如下所示,我們定義了一個(gè)int類型的變量num,因?yàn)槲覀儧]有顯式進(jìn)行設(shè)置初始值,所以它會(huì)擁有一個(gè)默認(rèn)值0
var num int
當(dāng)然,我們也可以顯式的為num變量指定合法的初始值,如下所示
var num int = 0
因?yàn)榫幾g器可以通過(guò)我們?cè)O(shè)置的初始值自動(dòng)推導(dǎo)出num的數(shù)據(jù)類型為int,
所有我們也可以直接省略上述變量定義中的類型int,簡(jiǎn)化后如下所示
var num = 0
現(xiàn)在是不是看著非常簡(jiǎn)潔了,那能否再進(jìn)一步的對(duì)其進(jìn)行簡(jiǎn)化呢,答案是當(dāng)然可以的。
我們可以使用:=來(lái)代替=來(lái)表達(dá)聲明并初始化一個(gè)變量的語(yǔ)義,并且此時(shí)我們也不再需要var關(guān)鍵字了。
下面就是我們定義一個(gè)變量的最簡(jiǎn)形式,也是最常用的一種定義變量的方式。
num := 0
不過(guò)值得注意的是,上述極簡(jiǎn)的變量定義方式,只能用于局部變量的定義,不能用于全局變量的聲明,即全局變量必須用var關(guān)鍵字進(jìn)行聲明。
當(dāng)然,在實(shí)際的開發(fā)中,我們的程序中肯定會(huì)擁有很多個(gè)變量,Golang為我們提供了分組或者批量定義變量的方法,
可以讓我們的代碼更加簡(jiǎn)短,并且讓邏輯更加緊湊,我們可以把一組相關(guān)的變量在同一個(gè)地方進(jìn)行定義,以表達(dá)其內(nèi)在關(guān)聯(lián)的含義。
比如下面這段代碼,我們定義了兩個(gè)整型的變量,并為其指定了不同的初始值
var num1 int = 1
var num2 int = 2
我們可以使用變量分組的方式對(duì)其進(jìn)行重構(gòu),這種寫法在局部變量或者全局變量的定義中都是通用的。
當(dāng)然與上述提到的帶var關(guān)鍵字的變量定義方式一樣,我們可以按需省略顯式的類型聲明和初始化值。
var (
num1 int = 1
num2 int = 1
)
細(xì)心的同學(xué)可能會(huì)發(fā)現(xiàn),上面使用分組對(duì)變量進(jìn)行聲明時(shí),我們似乎不能用最后一種極簡(jiǎn)的變量定義方式來(lái)批量定義多個(gè)變量了,這難免讓人感到遺憾。
所幸的是,Golang的開發(fā)者們已經(jīng)考慮到了這一點(diǎn),為極簡(jiǎn)方式的變量定義提供了另一種巧妙的批量聲明的語(yǔ)法,
并且會(huì)為后續(xù)函數(shù)的多返回值聲明提供強(qiáng)大的支持。
我們可以使用下面的極簡(jiǎn)方式批量定義多個(gè)變量,并且多個(gè)變量可以是不同類型,編譯器會(huì)為我們自動(dòng)推導(dǎo)其數(shù)據(jù)類型。
并且與定義單個(gè)變量一樣,定義多個(gè)變量的方式,也只能用于局部變量的定義,不能用于全局變量的聲明。
num1, num2 := 1, 2
這里將變量定義的幾個(gè)方式都整理到了下面的表格中,當(dāng)你遺忘時(shí)可以隨時(shí)回來(lái)查看,
每個(gè)人都可以根據(jù)各自的偏好和不同的場(chǎng)景選擇最合適的定義變量的方式。
| 變量定義 | 是否指定var | 是否指定類型 | 是否指定初始值 | 能否在全局中使用 |
|---|---|---|---|---|
| var num int | Y | Y | N | Y |
| var num int = 0 | Y | Y | Y | Y |
| var num = 0 | Y | N | Y | Y |
| num := 0 | N | N | Y | N |
| var ( ????num int ) |
Y | Y | N | Y |
| var ( ????num int = 0 ) |
Y | Y | Y | Y |
| var ( ????num = 0 ) |
Y | N | Y | Y |
| num1, num2 := 1, 2 | N | N | Y | N |
未使用的局部變量
如果你在IDE中親自動(dòng)手嘗試了上述的代碼,會(huì)發(fā)現(xiàn)編譯器報(bào)出了一個(gè)編譯錯(cuò)誤:num declared and not used。
這是因?yàn)樵贕olang中,所有局部變量都必須被使用過(guò),也就是變量必須被某段代碼讀取過(guò),因?yàn)槿绻覀儚奈醋x取過(guò)一個(gè)變量的值,
那說(shuō)明這是一個(gè)無(wú)用的變量,為了保持代碼的整潔,我們應(yīng)該刪除它。
當(dāng)然,如果你是定義的全局變量,那就不會(huì)出現(xiàn)這個(gè)錯(cuò)誤,因?yàn)槿肿兞靠赡軙?huì)被外部的包引用,編譯器無(wú)法判定它是否永遠(yuǎn)不會(huì)被使用。
不過(guò)有時(shí)候我們出于各種不同的原因,可能就是想要在代碼中保留未使用的變量,
這時(shí)我們就可以將變量賦值給_來(lái)讓編譯器認(rèn)為已經(jīng)使用了這個(gè)變量從而忽略這個(gè)編譯錯(cuò)誤,而且它不會(huì)產(chǎn)生任何副作用。
_ = num
此時(shí),我們的程序應(yīng)該能成功通過(guò)編譯并運(yùn)行了,不過(guò)因?yàn)闆]有寫任何邏輯代碼,所以不會(huì)有任何的輸出。
下面就讓我們來(lái)真正的使用變量吧。
變量的使用
變量的使用十分簡(jiǎn)單,和主流的編程語(yǔ)言沒有區(qū)別,使用上也沒有什么限制,我們可以對(duì)變量進(jìn)行多次讀取和寫入,如下面的代碼所示。
// 定義int類型的變量num并初始化為0
num := 0
// 將num的值重置為1
num = 1
// 打印num的值
println(num)
// 將num的值進(jìn)行加1
num++
// 再次打印num的值
println(num)
此時(shí)我們的代碼可以成功編譯并可以輸出相應(yīng)的結(jié)果了,因?yàn)槲覀冋嬲膶?duì)變量進(jìn)行了使用,所以成功通過(guò)了編譯器的檢查。
常量
常量是一種只能且必須在定義時(shí)進(jìn)行初始化的變量,并且在初始化之后不能再對(duì)其進(jìn)行修改。
定義常量
與變量類似,常量使用const關(guān)鍵字進(jìn)行定義,我們可以使用以下形式進(jìn)行常量定義和初始化。
const num int = 0
當(dāng)然這里我們也可以和變量定義一樣省略常量的類型,因?yàn)榫幾g器可以幫助我們推導(dǎo)其類型。
const num = 0
相比變量,只能使用以上兩種方式定義單獨(dú)的常量,因?yàn)槌A勘仨氃诙x時(shí)進(jìn)行顯式初始化,并且需要跟變量的定義進(jìn)行區(qū)分。
跟變量相同的是,上述兩種常量的定義方式,也適用于常量的批量分組定義。
跟變量一節(jié)一樣,這里同樣在表格中對(duì)常量的定義方式進(jìn)行了整理,以供查詢參考。
| 常量定義 | 是否指定const | 是否指定類型 | 是否指定初始值 | 能否在全局中使用 |
|---|---|---|---|---|
| const num int = 0 | Y | Y | Y | Y |
| const num = 0 | Y | N | Y | Y |
| const ( ????num int = 0 ) |
Y | Y | Y | Y |
| const ( ????num = 0 ) |
Y | N | Y | Y |
未使用的常量
與變量不同,未使用局部常量和全局常量都不會(huì)引發(fā)編譯器的報(bào)錯(cuò),不過(guò)IDE可能會(huì)建議我們刪除這些未使用的常量,
是否刪除完全由開發(fā)者或團(tuán)隊(duì)內(nèi)部的編碼規(guī)范等自行決定。
常量的使用
就如我們一開始所說(shuō)的,常量一旦定義并初始化之后,只能被讀取,無(wú)法被再次改寫,否則編譯器會(huì)提示報(bào)錯(cuò),如下面的代碼所示。
// 定義int常量num并初始化為0
const num int = 0
// 嘗試將num的值重置為1會(huì)導(dǎo)致編譯器報(bào)錯(cuò):cannot assign to num (neither addressable nor a map index expression)
// num = 1
// 打印num的值
println(num)
可訪問(wèn)性
在Hello World的教程中,我們有提到過(guò)函數(shù)的可訪問(wèn)性是通過(guò)函數(shù)的首字符來(lái)判斷的,全局變量和全局常量也是一樣。
如果變量或者常量定義在全局之中,且變量或者常量的名稱為小寫字母開頭或者以_開頭,
則只有當(dāng)前定義變量或者常量的包可以對(duì)其進(jìn)行訪問(wèn),反之則外部包都可以對(duì)其進(jìn)行自由訪問(wèn)。
如果變量或者常量定義在某個(gè)函數(shù)體內(nèi),則只有函數(shù)體內(nèi)部可以對(duì)其進(jìn)行訪問(wèn)。
小結(jié)
通過(guò)本小節(jié)的學(xué)習(xí),我們初步了解了Golang中變量和常量的使用,以及它們之間的一些區(qū)別。
同時(shí),我們對(duì)Golang的簡(jiǎn)約性設(shè)計(jì)也有了一個(gè)初步的認(rèn)識(shí),后續(xù)的學(xué)習(xí)中我們會(huì)逐步體會(huì)到這一點(diǎn),
讓我們一起來(lái)深入探索Golang這個(gè)強(qiáng)大而又簡(jiǎn)潔的編程語(yǔ)言吧!