常量和Java中的意思類似,就是被定義后,在程式運行時,不會被修改的量,
Java中定義常量使用final 關鍵字,Scala中定義常量使用 val ,那么在Go語言中定義常量使用的是const.
常量中的資料型別只可以是布爾型、數字型(整數型、浮點型和復數)和字串,
常量的定義:
const identifier [type] = value
定義常量的時候型別可以省略,例如:
const str = "abcde"
因為編譯器可以根據變數的值來自己推斷其型別,就像scala中一樣,
多個相同型別的宣告可以簡寫,不用一個一個單獨定義:
const str1, str2 = "zhangsan", "lisi"
不同型別也可以進行多重賦值:
const a, b, c = 1, false, "str"
用作列舉
const (
gender = 0
male = 1
female = 2
)
數字 0、1 和 2 分別代表未知性別、男性和女性,
常量可以用len(), cap(), unsafe.Sizeof()函式計算運算式的值,
常量運算式中,函式必須是內置函式,否則編譯不過,
示例:
package main
import "unsafe"
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(a)
)
func main(){
println(a, b, c)
}
//運行結果為:
abc 3 16
//因為Golang中的string內部實作由兩部分組成,一部分是指向字串起始地址的指標,另一部分是字串的長度,兩部分各是8位元組,所以一共16位元組
iota
iota,特殊常量,可以認為是一個可以被編譯器修改的常量,
iota 在 const關鍵字出現時將被重置為 0(const 內部的第一行之前),const 中每新增一行常量宣告將使 iota 計數一次(iota 可理解為 const 陳述句塊中的行索引),
iota 可以被用作列舉值:
const (
a = iota
b = iota
c = iota
)
第一個 iota 等于 0,每當 iota 在新的一行被使用時,它的值都會自動加 1;
所以 a=0, b=1, c=2 可以簡寫為如下形式:
const (
a = iota //0
b //1
c //2
)
iota 用法:
package main
import "fmt"
func main() {
const (
a = iota //0
b //1
c //2
d = "ha" //獨立值,iota += 1
e //"ha" iota += 1
f = 100 //iota +=1
g //100 iota +=1
h = iota //7,恢復計數
i //8
)
fmt.Println(a,b,c,d,e,f,g,h,i)
}
運行結果為:
0 1 2 ha ha 100 100 7 8
當賦值時,還是會默認在自動加1,但是不會把加的值做為最后的值,沒有新的賦值,后面的值都參考上一次的值;但再次出現iota時,恢復相加后的值做為賦給后的值,如果后面沒有再出現新的賦值,就會以自加的值做為最后的值,以此類推,
示例:
package main
import "fmt"
const (
a=1<<iota //1
b=3<<iota //3*2^1
c //3*2^2
d //3*2^3
)
func main() {
fmt.Println("a=",a)
fmt.Println("b=",b)
fmt.Println("c=",c)
fmt.Println("d=",d)
}
運行結果為:
a= 1
b= 6
c= 12
d= 24
iota 表示從 0 開始自動加 1,所以 a=1<<0, b=3<<1(<< 表示左移的意思),即:a=1, b=6,這沒問題,關鍵在 c 和 d,從輸出結果看 c=3<<2,d=3<<3,
決議:
a=1:左移 0 位,不變仍為 1:
- b=3:左移 1 位,變為二進制 110, 即 6;
- c=3:左移 2 位,變為二進制 1100, 即 12;
- d=3:左移 3 位,變為二進制 11000,即 24,
演算法:
m<<n==m*(2^n),表示m*2的N次方,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/72976.html
標籤:其他
