iota
我们知道iota
常用于cost
表达式中,其值是从0开始的,const声明快中每增一行,iota
值自增1
const (
a0,b0 = 1<< iota, 1 << iota - 1
a1,b1
_,_
a3,b3
)
注意iota
标识符只能用于常量表达式中,那么想要了解iota
是如何运作的,就要看看go的编译器是如何处理常量声明的。
在编译器代码中,每个常量声明语句使用ValueSpec
结构表示(src/go/ast/ast.go:ValueSpec)
type (
//其他结构
// A ValueSpec node represents a constant or variable declaration
// (ConstSpec or VarSpec production).
//
ValueSpec struct {
Doc *CommentGroup //表示块注释。往往会出现在文档的注释中
Names []*Ident // 表示常量的名字,使用切片表示单行语句中声明的多个常量
Type Expr // 常量类型
Values []Expr // 常量值
Comment *CommentGroup // 行注释
}
//其他结构
)
ValueSpec 结构不仅可以用来表示常量声明,还可以表示变量声明,但它仅仅表示一行声明语句
const (
//常量的注释(文档)
a,b = iota,iota //常量的行注释
)
编译器在构造常量时遵循以下的步骤
for iota,spec := range ValueSpecs {
for i,name := range spec.Names {
obj := NewConst(name, iota...)
}
}
从上面的代码可以看出iota 表明了const声明块的行索引