一,常量
- 介绍
常量是在编译时期创建的,即使当定义在函数内,并且只能是numbers,characters(runes),strings或者booleans。由于编译时的限制,定义它们的表达式必须是可由编译器求值的常量表达式。 - 常量表达式案例
1 << 4是一个常量表达式。
math.Sin(math.Pi/3)不是常量表达式,因为math.Sin是在运行时执行的。
二,iota的使用注意事项
官方介绍:在Go中,枚举常量的创建推荐使用iota,由于iota能够作为表达式的一部分且能够隐式的重复,因此很容易的去构建复杂的值集。
- 官方使用案例
type ByteSize float64
const (
_ = iota // ignore first value by assigning to blank identifier
KB ByteSize = 1 << (10 * iota)
MB
GB
TB
PB
EB
ZB
YB
)
func (b ByteSize) String() string {
switch {
case b >= YB:
return fmt.Sprintf("%.2fYB", b/YB)
case b >= ZB:
return fmt.Sprintf("%.2fZB", b/ZB)
case b >= EB:
return fmt.Sprintf("%.2fEB", b/EB)
case b >= PB:
return fmt.Sprintf("%.2fPB", b/PB)
case b >= TB:
return fmt.Sprintf("%.2fTB", b/TB)
case b >= GB:
return fmt.Sprintf("%.2fGB", b/GB)
case b >= MB:
return fmt.Sprintf("%.2fMB", b/MB)
case b >= KB:
return fmt.Sprintf("%.2fKB", b/KB)
}
return fmt.Sprintf("%.2fB", b)
}
iota每遇到一个const都会清零
默认是从0开始,所以上面的( - = iota )表示抛弃第一个为0的数据
const 集合中从上到下,iota是逐步递增的,案例 1 << (10 * iota) 中的iota值为1,所以实际上是1左移10位等于1024,MB则是左移20位。依次类推知道YB。
民间案例
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
)
结果:
0 1 2 ha ha 100 100 7 8
通过该案例可以明显看到iota遇到主动赋值的条目时,并不会终止累加,而是会继续隐式增加iota的值。
参考:
https://golang.google.cn/doc/effective_go.html#initialization
https://blog.csdn.net/cbwcole/article/details/102868825
有疑问加站长微信联系(非本文作者)