Go进阶之Iota

16 阅读1分钟

常量声明语句中.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的值仍然保持不变.

吹不断的风.斩不断的水.

如果大家喜欢我的分享的话.可以关注我的微信公众号

念何架构之路