常量是一种表达式,在程序编译阶段就计算出其值,在程序运行时没法改变该值,从而使编译器得以知晓其值(编译优化),减小运行时的错误,提高运行时的性能。golang
全部常量的数据类型都属于基本类型:布尔型、数字型(整数型、浮点型和复数)和字符串型。数组
常量做为操做数时,全部算术运算、逻辑运算和比较运算的结果依然是常量,常量的类型转换结果和某些内置函数的返回值,例如len、cap、real、imag、complex和unsafe.Sizeof,一样是常量。bash
常量的声明格式:ide
const identifier [type] = value
复制代码
能够省略类型说明符 [type],由于编译器能够根据右边的表达式来推断其类型。函数
显式类型定义: const b string = "abc"
性能
隐式类型定义: const b = "abc"
优化
多重赋值的声明能够简写为:ui
const c_name1, c_name2 = value1, value2
复制代码
批量声明常量:spa
const (
Unknown = 0
Female = 1
Male = 2
)
复制代码
由于常量是在编译器肯定的,所以能够做为一些复杂类型的组成部分,好比数组类型的长度:code
const IPv4Len = 4
var p [IPv4Len]byte
复制代码
由于常量做为操做数时返回结果仍然为常量,所以常量能够用len()、cap()、 unsafe.Sizeof()函数计算表达式的值。常量表达式中,函数必须是内置函数,不然编译不过:
import "unsafe"
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(a)
)
fmt.Println(a, b, c) // abc 3 16
复制代码
批量声明常量时,除了第一个常量,其它常量声明时的右边表达式均可以省略。若是某个常量的右边表达式缺失,则该常量的值和类型等于前面常量的值和类型,例如:
const (
a = 1
b
c = 2
d
)
fmt.Println(a, b, c, d) // 1 1 2 2
复制代码
实际应用中,上面的代码并无太多实用价值,可是能够利用它实现iota语法。
iota是golang语言的常量计数器,只能在常量的表达式中使用,属于特殊常量,能够认为是一个能够被编译器修改的常量。
iota在const关键字出现时将被重置为0(const内部的第一行以前),const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。
理解:
- iota只能在常量的表达式中使用, 反之
fmt.Println(iota)
编译错误: undefined: iota- 每次 const 出现时,都会让 iota 初始化为0。
const a = iota // a = 0 const ( b = iota // b = 0 c // c = 1 ) 复制代码
iota 用法
const (
a = iota
b = iota
c = iota
)
复制代码
自增加常量常常包含一个自定义枚举类型,容许你依靠编译器完成自增设置。
type Weekday int
const (
Sunday Weekday = iota // 0
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
)
复制代码
可使用下划线跳过不想要的值
type AudioOutput int
const (
OutMute AudioOutput = iota // 0
OutMono // 1
OutStereo // 2
_ // iota += 1
_ // iota += 1
OutSurround // 5
)
复制代码
const (
_ = 1 << (10 * iota)
KiB // 1024
MiB // 1024 * 1024
GiB // 1024 * 1024 * 1024
)
复制代码
const (
Apple, Banana = iota + 1, iota + 2 // Apple:1, Banana:2
Cherimoya, Durian // Cherimoya:2, Durian:3
Elderberry, Fig // Elderberry:3, Fig:4
)
复制代码
const (
i = iota // i = 0
j = 3.14 // j = 3.14, iota += 1
k = iota // k = 2, iota += 1
l // l = 3
)
复制代码