常量声明语句中.iota往往用于声明连续的整型常量.itoa的位置与其的位置强相关.
iota取值描述:
iota在const关键字出现时被重置为0.
const声明块中每新增一行.iota的值自增.
注:这种描述适用于简单的语句中快速计算值.复杂的语句中.这种规则充满歧义.
编译器角度:
itoa代表了const声明块的行索引.(下标从0开始).
特点:
如果为常量指定了一个表达式.后续的常量没有表达式.则继承上面的表达式.
实现原理:
ValueSpec struct {
Doc *CommentGroup // associated documentation; or nil
Names []*Ident // value names (len(Names) > 0)
Type Expr // value type; or nil
Values []Expr // initial values; or nil
Comment *CommentGroup // line comments; or nil
}
Doc: 表示块注释.往往会出现在文档的注释中.
Name: 表示常量的名字.使用切片表示单行语句中声明多个常量.
Type: 表示类型.
Values: 表示常量值.与name对应.表示常量的初始值.
Comment: 表示行注释.
编译器在构造常量时.实际上会遍历ValueSpec结构中的Name切片来逐个生成常量.
伪代码如下:
for iota, spec := range ValueSpecs {
for i, name := range spec.Names {
obj := NewConst(name, itoa...)
...
}
}
从上面伪代码可以看出iota的本质.它仅代表常量声明的索引.特征如下:
1).单个const声明块从0开始取值.
2).单个声明块中.每增加一行声明.iota的取值增一.即使没有iota也是如此.
3).单行声明语句中.即使出现多个iota.iota的值仍然保持不变.
吹不断的风.斩不断的水.
如果大家喜欢我的分享的话.可以关注我的微信公众号
念何架构之路