道可道,很是道。這裏常道指的永恆不變的道理,常有不變的意思。顧名思義和變量相比,常量在聲明以後就不可改變,它的值是在編譯期間就肯定的。
下面簡單的聲明一個常量:code
const p int = 1
聲明常量的時候能夠指定類型也能夠相似:=
簡單聲明同樣,不指定類型以下:字符串
const p = 1
也能夠同時給多個賦值:io
const i, j = 1, 2 const m, n = 1, "a"
也能夠批量的聲明:編譯
const ( a = 0 b = 1 )
若是批量的聲明,後面的能夠省略聲明具體的值,它會和上一行的值保持一致好比:class
const ( a = 1 b c = 2 d ) fmt.Println(a, b, c, d) // "1 1 2 2"
咱們曾屢次提到Go
是一門靜態語言,變量的類型是不可變,甚至不能夠對int
和int32
兩種類型的變量進行+
操做,即便int
也是32
位的例如:import
package main import "fmt" func main() { var a int = 1 var b int32 = 2 fmt.Println(a + b) }
編譯的時候會報invalid operation: a + b (mismatched types int and int32)
而簡單聲明的變量又是什麼類型呢把上面的代碼修改基礎
package main import "fmt" func main() { a := 1 var b int = 2 fmt.Println(a + b) }
發現是能夠運行的,可是若是把b
改爲var b int32 = 2
也會報相同的錯誤,說明:=
會給變量指定一個默認的數據類型,這個類型是肯定。
常量和變量有一個很大的不一樣就是,它對六種基礎數據類型 布爾、整數、字符、浮點數、複數、字符串
,若是聲明的時候沒有明確指定類型,它是不肯定類型
的,而是用到它的時候再肯定它是否知足這個類型的運行去肯定它具體的類型。回到上面的代碼,咱們若是改爲這樣:變量
package main import "fmt" func main() { const a = 1 var b int32 = 2 fmt.Println(a + b) }
這時運行經過,運行的時候a
是 int32類型。那麼是否是它之後一直是這一種類型呢,咱們看看下面的代碼:數據類型
package main import "fmt" func main() { const a = 1 var b int32 = a var c int = a fmt.Println(a) fmt.Println(c) }
咱們能夠看到c
和b
不是相同類型,但仍是能夠把a
即賦值給b
也能夠賦值給c
。也就是說只要是整數,不管是什麼類型均可以參與運行。一樣的道理,只要聲明常量的時候沒有指定類型,給它的賦值又是六種基本類型,常量均可以知足這個特性。im
iota
能夠理解爲一個特殊的常量,它只能和const
一塊兒出現,並且只要const
出現它就會被重置爲0
,而後每有一個常量被聲明它就加1
package main import "fmt" func main() { const ( a = iota b c ) println(a, b, c) // 0 1 2 const ( d = iota e f ) fmt.Println(d, e, f) // 0 1 2 }
上面的a, b, c
的聲明從0開始,每增長一行就加1。到d, e, f
以後因爲出現了const
因此iota
又被重置爲0
了。
iota
也能夠在聲明中參加運算,例如
const ( a = iota * 3 b c ) fmt.Println(a, b, c) // 0 3 6
下面一行保持和第一行相同的運行規則只是iota
加1
了,因此至關於b = 3 * 1