![]()
Go 的類型常量和非類型常量是兩個必須要了解的關(guān)鍵概念
不要忘記在文章下面有很多代碼示例,因此你要確保點擊這些鏈接并嘗試運行這些程序。
你為什么使用常量?
你不想在代碼中到處定義魔法數(shù)值,于是使用常量來聲明它們,并在代碼中再次使用它們。
魔法數(shù)值是不安全的,你需要準確聲明它們,因此,常量是一個安全的選擇。除此之外,在代碼中看到常量而不是魔法數(shù)值也是令人高興的;人們可以更好地理解代碼是怎樣的。
我們希望我們可以在使用常量中獲得運行速度上的收益,因為,使用常量能夠使編譯器能夠進行更多的優(yōu)化,它將知道常量的值永遠不會改變。
我最喜歡的是非類型化常量。它真是個天才的想法。當使用非類型化常量時,你將獲得更多的靈活性和高精度的計算。
類型常量
類型 →Boolean,rune,numerics,或者 string
值 → 編譯期時在聲明中分配值
地址 → 你無法得到它在內(nèi)存中的地址(不像變量)
- 你無法在聲明常量之后再改變它
- 你不能使用運行時的結(jié)構(gòu),例如變量,指針,數(shù)組,切片,map,結(jié)構(gòu)體,接口,方法調(diào)用,或者方法的值。
類型化常量聲明
圖中定義了一個類型常量 Pi,它的類型為 float64,值為 3.14
聲明多個常量
在一個代碼塊中聲明多個具有不同類型不同值的常量
- 當一個常量的類型和值沒有聲明時,它將從上一個常量中得到它。在上面,pi2 從 pi 中獲取其類型和值。
- Age 常量在聲明時有一個新的值。并且,它通過賦值為 10 獲取默認的類型 int。
- 可以在同一行和多個變量聲明中定義多個常量。
非類型化常量
它們有很好的特性,比如高精度的計算以及在所有數(shù)值表達式中使用它們而不聲明類型等。下面我將介紹這些特性。它們就像 Go 中的通配符。
理想類型 → 與 Go 通常類型不同的隱藏類型。
理想值 → 存在于理想值空間中,并且具有默認類型。
默認類型 → 取決于理想值。
非類型化常量的聲明
聲明了一個非類型化的常量 Pi,并且為它賦值為 3.14,那么它默認的類型就是 float。
當需要它的類型的時候,圖片左側(cè)(期望類型)將轉(zhuǎn)化為右邊的類型(預(yù)先聲明的類型)
高精度計算
如果常量只停留在非類型化常量領(lǐng)域,那么它沒有速度的限制!但是,當將常量賦值給變量進行使用時,速度就有限制了。
當你將其分配給變量時,非類型化常量的精度會降低,其默認類型會轉(zhuǎn)換為 Go 的普通類型[6]。
靈活的表達方式
你可以使用非類型化常量臨時從 Go 的強類型系統(tǒng)中逸出,直到它們在類型要求表達式中的計算為止。
我在代碼中[8]一直使用它們時,會避免在不需要強類型時聲明它們。所以,如果你不真正需要常量,就不要用它聲明類型。
運行代碼示例
- Understand when and how to use untyped constants[9]
- We can assign an untyped constant to any numeric-type variable[10]
常量作用范圍
一個常量只能在它的聲明的作用域內(nèi)使用。如果你在更內(nèi)部的作用域內(nèi)以同樣的名字再聲明一個常量,那么這個常量僅僅在內(nèi)部作用域內(nèi)可以使用,并且在此作用域內(nèi)將覆蓋外部聲明的常量。
掃碼二維碼 獲取免費視頻學習資料
- 本文固定鏈接: http://www.wangchenghua.com/post/7183/
- 轉(zhuǎn)載請注明:轉(zhuǎn)載必須在正文中標注并保留原文鏈接
- 掃碼: 掃上方二維碼獲取免費視頻資料