常量:Go 在“常量”設(shè)計(jì)上的創(chuàng)新有哪些?
- Go 語(yǔ)言在常量方面的創(chuàng)新包括下面這幾點(diǎn):
- 支持無(wú)類型常量;
- 支持隱式自動(dòng)轉(zhuǎn)型;
- 可用于實(shí)現(xiàn)枚舉。
常量
- Go 語(yǔ)言的常量是一種在源碼編譯期間被創(chuàng)建的語(yǔ)法元素。這是在說(shuō)這個(gè)元素的值可以像變量那樣被初始化,但它的初始化表達(dá)式必須是在編譯期間可以求出值來(lái)的。
- Go 常量一旦聲明并被初始化后,它的值在整個(gè)程序的生命周期內(nèi)便保持不變。
- 我們?cè)诓l(fā)設(shè)計(jì)時(shí)不用考慮常量訪問(wèn)的同步,并且被創(chuàng)建并初始化后的常量還可以作為其他常量的初始表達(dá)式的一部分。
- Go 是使用 var 關(guān)鍵字聲明變量的。在常量這里,Go 語(yǔ)言引入 const 關(guān)鍵字來(lái)聲明常量。而且,和 var 支持單行聲明多個(gè)變量,以及以代碼塊形式聚合變量聲明一樣,const 也支持單行聲明多個(gè)常量,以及以代碼塊形式聚合常量聲明的形式:
const Pi float64 = 3.14159265358979323846 // 單行常量聲明 // 以 const 代碼塊形式聲明常量 const ( size int64 = 4096 i, j, s = 13, 14, "bar" // 單行聲明多個(gè)常量 )
- Go 語(yǔ)言規(guī)范規(guī)定,Go 常量的類型只局限于 Go 基本數(shù)據(jù)類型,包括數(shù)值類型、字符串類型,以及只有兩個(gè)取值(true 和 false)的布爾類型。
無(wú)類型常量
- Go 語(yǔ)言對(duì)類型安全是有嚴(yán)格要求的:即便兩個(gè)類型擁有著相同的底層類型,但它們?nèi)匀皇遣煌臄?shù)據(jù)類型,不可以被相互比較或混在一個(gè)表達(dá)式中進(jìn)行運(yùn)算。這一要求不僅僅適用于變量,也同樣適用于有類型常量(Typed Constant)中。
- 有類型常量與變量混合在一起進(jìn)行運(yùn)算求值的時(shí)候,也必須遵守類型相同這一要求,否則我們只能通過(guò)顯式轉(zhuǎn)型才能讓代碼正常工作。
- 常量在聲明時(shí)并沒(méi)有顯式地被賦予類型,在 Go 中,這樣的常量就被稱為無(wú)類型常量(Untyped Constant)。
- 無(wú)類型常量也不是說(shuō)就真的沒(méi)有類型,它也有自己的默認(rèn)類型,不過(guò)它的默認(rèn)類型是根據(jù)它的初值形式來(lái)決定的。
隱式轉(zhuǎn)型
- 隱式轉(zhuǎn)型說(shuō)的就是,對(duì)于無(wú)類型常量參與的表達(dá)式求值,Go 編譯器會(huì)根據(jù)上下文中的類型信息,把無(wú)類型常量自動(dòng)轉(zhuǎn)換為相應(yīng)的類型后,再參與求值計(jì)算,這一轉(zhuǎn)型動(dòng)作是隱式進(jìn)行的。
- 但由于轉(zhuǎn)型的對(duì)象是一個(gè)常量,所以這并不會(huì)引發(fā)類型安全問(wèn)題,Go 編譯器會(huì)保證這一轉(zhuǎn)型的安全性。
實(shí)現(xiàn)枚舉
- Go 語(yǔ)言其實(shí)并沒(méi)有原生提供枚舉類型,在 Go語(yǔ)言中,我們可以使用 const 代碼塊定義的常量集合,來(lái)實(shí)現(xiàn)枚舉。
- 首先,Go 的 const 語(yǔ)法提供了“隱式重復(fù)前一個(gè)非空表達(dá)式”的機(jī)制:
const ( Apple, Banana = 11, 22 Strawberry, Grape Pear, Watermelon )
- 這個(gè)代碼里,常量定義的后兩行并沒(méi)有被顯式地賦予初始值,所以 Go 編譯器就為它們自動(dòng)使用上一行的表達(dá)式:
const ( Apple, Banana = 11, 22 Strawberry, Grape = 11, 22 Pear, Watermelon = 11, 22 )
- 不過(guò),僅僅是重復(fù)上一行顯然無(wú)法滿足“枚舉”的要求,因?yàn)槊杜e類型中的每個(gè)枚舉常量的值都是唯一的。所以,Go 在這個(gè)特性的基礎(chǔ)上又提供了“神器”:iota。
- iota 是 Go 語(yǔ)言的一個(gè)預(yù)定義標(biāo)識(shí)符,它表示的是 const 聲明塊(包括單行聲明)中,每個(gè)常量所處位置在塊中的偏移值(從零開(kāi)始)。
- 同時(shí),每一行中的 iota 自身也是一個(gè)無(wú)類型常量,可以自動(dòng)參與到不同類型的求值過(guò)程中來(lái),不需要我們?cè)賹?duì)它進(jìn)行顯式轉(zhuǎn)型操作。
const ( Apple, Banana = iota, iota + 10 // 0, 10 (iota = 0) Strawberry, Grape // 1, 11 (iota = 1) Pear, Watermelon // 2, 12 (iota = 2) )
- 如果一個(gè) Go 源文件中有多個(gè) const 代碼塊定義的不同枚舉,每個(gè) const 代碼塊中的 iota 也是獨(dú)立變化的,也就是說(shuō),每個(gè) const 代碼塊都擁有屬于自己的 iota。
- 每個(gè) iota 的生命周期都始于一個(gè) const 代碼塊的開(kāi)始,在該 const 代碼塊結(jié)束時(shí)結(jié)束。
- 這個(gè)代碼里,常量定義的后兩行并沒(méi)有被顯式地賦予初始值,所以 Go 編譯器就為它們自動(dòng)使用上一行的表達(dá)式:
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-664629.html
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-664629.html
到了這里,關(guān)于《Go 語(yǔ)言第一課》課程學(xué)習(xí)筆記(九)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!