圖解 Go 常量

Go 的類型常量和非類型常量是兩個必須要了解的關鍵概念

不要忘記在文章下面有很多代碼示例,因此你要確保點擊這些鏈接並嘗試運行這些程序。

你爲什麼使用常量?

why_might_you_use_constants?.image

你不想在代碼中到處定義魔法數值 [1],於是使用常量來聲明它們,並在代碼中再次使用它們。

魔法數值是不安全的,你需要準確聲明它們,因此,常量是一個安全的選擇。除此之外,在代碼中看到常量而不是魔法數值也是令人高興的;人們可以更好地理解代碼是怎樣的。

我們希望我們可以在使用常量中獲得_運行速度上的收益_,因爲,使用常量能夠使編譯器能夠進行更多的優化,它將知道常量的值永遠不會改變。

我最喜歡的是非類型化常量。它真是個天才的想法。當使用非類型化常量時,你將獲得更多的靈活性和高精度的計算。

類型常量

typed_constants.image

類型→ Boolean,rune,numerics, 或者 string

值→編譯期時在聲明中分配值

地址→你無法得到它在內存中的地址(不像變量)

類型化常量聲明

image

圖中定義了一個類型常量 Pi,它的類型爲 float64,值爲 3.14

運行並且嘗試代碼示例,請點擊這裏 [2]

聲明多個常量

image

運行圖中的代碼並且檢驗它的結果,請點擊這裏 [3]

在一個代碼塊中聲明多個具有不同類型不同值的常量

非類型化常量

它們有很好的特性,比如高精度的計算以及在所有數值表達式中使用它們而不聲明類型等。下面我將介紹這些特性。它們就像 Go 中的通配符。

iamge

理想類型→與 Go 通常類型不同的隱藏類型。

理想值→存在於理想值空間中,並且具有默認類型。

默認類型→取決於理想值。

非類型化常量的聲明

image

聲明瞭一個非類型化的常量 Pi,並且爲它賦值爲 3.14,那麼它默認的類型就是 float。

image

當需要它的類型的時候,圖片左側(期望類型)將轉化爲右邊的類型(預先聲明的類型)

嘗試代碼,點擊這裏 [5]

高精度計算

如果常量只停留在非類型化常量領域,那麼它沒有速度的限制!但是,當將常量賦值給變量進行使用時,速度就有限制了。

image

當你將其分配給變量時,非類型化常量的精度會降低,其默認類型會轉換爲 Go 的普通類型 [6]。

運行代碼示例,請點擊這裏 [7]

靈活的表達方式

你可以使用非類型化常量臨時從 Go 的強類型系統中逸出,直到它們在類型要求表達式中的計算爲止。

我在代碼中 [8] 一直使用它們時,會避免在不需要強類型時聲明它們。所以,如果你不真正需要常量,就不要用它聲明類型。

運行代碼示例

常量作用範圍

image

一個常量只能在它的聲明的作用域內使用。如果你在更內部的作用域內以同樣的名字再聲明一個常量,那麼這個常量僅僅在內部作用域內可以使用,並且在此作用域內將覆蓋外部聲明的常量。查看代碼示例,請點擊這裏 [11]


via: https://blog.learngoprogramming.com/learn-golang-typed-untyped-constants-70b4df443b61

作者:Inanc Gumus[12] 譯者:xmge[13] 校對:polaris1119[14]

本文由 GCTT[15] 原創編譯,Go 中文網 [16] 榮譽推出,發佈在 Go 語言中文網公衆號,轉載請聯繫我們授權。

參考資料

[1]

魔法數值: https://en.wikipedia.org/wiki/Magic_number%28programming%29_

[2]

請點擊這裏: https://play.golang.org/p/mrnqxa8Kic

[3]

請點擊這裏: https://play.golang.org/p/mBoqG58z_e

[4]

多個變量: https://blog.learngoprogramming.com/learn-go-lang-variables-visual-tutorial-and-ebook-9a061d29babe#4176

[5]

這裏: https://play.golang.org/p/L5UC3XgYFk

[6]

普通類型: https://golang.org/ref/spec#Boolean_types

[7]

請點擊這裏: https://play.golang.org/p/4ODv0n_stw

[8]

代碼中: https://github.com/inancgumus/myhttp/blob/master/get.go#L12

[9]

Understand when and how to use untyped constants: https://play.golang.org/p/2cgFoB4rYD

[10]

We can assign an untyped constant to any numeric-type variable: https://play.golang.org/p/7-VMh5egC-

[11]

請點擊這裏: https://play.golang.org/p/c3-GF_a5iI

[12]

Inanc Gumus: https://www.activestate.com/blog/author/peteg/

[13]

xmge: https://github.com/xmge

[14]

polaris1119: https://github.com/polaris1119

[15]

GCTT: https://github.com/studygolang/GCTT

[16]

Go 中文網: https://studygolang.com/

福利

我爲大家整理了一份從入門到進階的 Go 學習資料禮包,包含學習建議:入門看什麼,進階看什麼。關注公衆號 「polarisxu」,回覆 ebook 獲取;還可以回覆「進羣」,和數萬 Gopher 交流學習。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/cW5wNt2L-l8oxKOjPCMg0A