Golang常量例項分析教程
整理了一篇Golang常量例項分析教程,希望對大家有所幫助。
1.Golang常量的定義格式:
const identifier [type] = value
你可以省略型別說明符 [type],因為編譯器可以根據變數的值來推斷其型別。
- 顯式型別定義: const b string = "abc"
- 隱式型別定義: const b = "abc"
多個相同型別的宣告可以簡寫為:
const c_name1, c_name2 = value1, value2
以下例項演示了常量的應用:
package main
import "fmt"
func main() {
const LENGTH int = 10
const WIDTH int = 5
var area int
const a, b, c = 1, false, "str" //多重賦值
area = LENGTH * WIDTH
fmt.Printf("面積為 : %d", area)
println()
println(a, b, c)
}
以上例項執行結果為:
面積為 : 50
1 false str
常量還可以用作列舉:
const (
Unknown = 0
Female = 1
Male = 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
iota
iota,特殊常量,可以認為是一個可以被編譯器修改的常量。
在每一個const關鍵字出現時,被重置為0,然後再下一個const出現之前,每出現一次iota,其所代表的數字會自動增加1。
iota 可以被用作列舉值:
const (
a = iota
b = iota
c = iota
)
第一個 iota 等於 0,每當 iota 在新的一行被使用時,它的值都會自動加 1;所以 a=0, b=1, c=2 可以簡寫為如下形式:
const (
a = iota
b
c
)
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
再看個有趣的的 iota 例項:
package main
import "fmt"
const (
i=1<<iota
j=3<<iota
k
l
)
func main() {
fmt.Println("i=",i)
fmt.Println("j=",j)
fmt.Println("k=",k)
fmt.Println("l=",l)
}
以上例項執行結果為:
i= 1
j= 6
k= 12
l= 24
iota 表示從 0 開始自動加 1,所以 i=1<<0, j=3<<1(<< 表示左移的意思),即:i=1, j=6,這沒問題,關鍵在 k 和 l,從輸出結果看 k=3<<2,l=3<<3。
簡單表述:
i=1:左移 0 位,不變仍為 1;j=3:左移 1 位,變為二進位制 110, 即 6; k=3:左移 2 位,變為二進位制 1100, 即 12; l=3:左移 3 位,變為二進位制 11000,即 24。
篇筆記
a = "hello"
unsafe.Sizeof(a)
1.
輸出結果為:16
字串型別在 go 裡是個結構, 包含指向底層陣列的指標和長度,這兩部分每部分都是 8 個位元組,所以字串型別大小為 16 個位元組。
2.常量值必須是編譯期可確定的數字、字串、布林值。
const x, y int = 1, 2 // 多常量初始化
const s = "Hello, World!" // 型別推斷
const ( // 常量組
a, b = 10, 100
c bool = false
)
func main() {
const x = "xxx" // 未使⽤用區域性常量不會引發編譯錯誤。
}
在常量組中,如不提供型別和初始化值,那麼視作與上⼀一常量相同。
const (
s = "abc"
x // x = "abc"
)
常量值還可以是 len、cap、unsafe.Sizeof 等編譯期可確定結果的函式返回值。
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(b)
)
如果常量型別⾜足以儲存初始化值,那麼不會引發溢位錯誤。
const (
a byte = 100 // int to byte
b int = 1e20 // float64 to int, overflows
)
列舉
關鍵字 iota 定義常量組中從 0 開始按⾏行計數的⾃自增列舉值。
const (
Sunday = iota // 0
Monday // 1,通常省略後續⾏行表示式。
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
const (
_ = iota // iota = 0
KB int64 = 1 << (10 * iota) // iota = 1
MB // 與 KB 表示式相同,但 iota = 2
GB
TB
)
在同⼀一常量組中,可以提供多個 iota,它們各⾃自增⻓長。
const (
A, B = iota, iota << 10 // 0, 0 << 10
C, D // 1, 1 << 10
)
如果 iota ⾃自增被打斷,須顯式恢復。
const (
A = iota // 0
B // 1
C = "c" // c
D // c,與上⼀一⾏行相同。
E = iota // 4,顯式恢復。注意計數包含了 C、D 兩⾏行。
F // 5
)
可通過⾃自定義型別來實現列舉型別限制。
type Color int
const (
Black Color = iota
Red
Blue
)
func test(c Color) {}
func main() {
c := Black
test(c)
x := 1
test(x) // Error: cannot use x (type int) as type Color in function argument
test(1) // 常量會被編譯器⾃自動轉換。
}
在go語言中,沒有直接支援列舉的關鍵字,也就造成go沒有直接列舉的功能。但是go提供另一種方法來實現列舉,那就是const+iota
package main
import(
"fmt"
)
type State int
const (
Running State = iota
Stopped
Rebooting
Terminated
)
func (this State) String()string{
switch this {
case Running :
return "Running"
case Stopped :
return "Stopped"
default :
return "Unknow"
}
}
func main(){
state := Stopped
fmt.Println("state", state)
}
執行...
state Stopped
Linux公社的RSS地址 : ofollow,noindex" target="_blank">https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址: https://www.linuxidc.com/Linux/2018-11/155595.htm