七叶笔记 » golang编程 » 「GoLang编程」GoLang 中的 iota

「GoLang编程」GoLang 中的 iota

GoLang中常量定义和C语言中很相似:

C中,const int NYEAR=12;

GoLang中,也是用const,但这样写:

 const(
Nyear=12
Nmonth=30
)  

如果是数值型,并且需要递增时,C语言可以这样写:

 enum week{
Mon=1,
Tues,         // 2
Wed,         //3
Thurs         //3
}  

也是自动递增。但是类型就是枚举类型了。

GoLang中自动递增的常量,写成这样:

 const (
   _     =iota          //  iota的 初始值是0   ,忽略此值,不命名。
  Mon                   //1    ,每换行才递增
  Tues                   //2       ,每换行才递增
  Wed                  //3
  Thurs                  //4
  )  

iota表示自动递增,每换行才执行递增计算。iota初始值是0。

如果有”_”下划线,表示跳过命名,但是iota需要递增计算。

常量定义中,默认使用上一行的表达式来计算下一行的值,上面的例子中,就相当于:

Mon 的值就是 先计算递增值为1,再赋值给Mon。如果是个表达式,看下面例子

 const(
_ =iota      // 忽略 0 
a =iota+1  // a=1+1 =2
b                // b=2+1=3
c                //  c =3+1=4
)  

注释中明确解释了表达式的计算方式。

最后,给一个经典写法:

 type ByteSize float64

const (
    _           = iota                   // ignore first value by assigning to blank identifier
    KB ByteSize = 1 << (10 * iota) // 1 << (10*1)
    MB                                   // 1 << (10*2)
    GB                                   // 1 << (10*3)
    TB                                   // 1 << (10*4)
    PB                                   // 1 << (10*5)
    EB                                   // 1 << (10*6)
    ZB                                   // 1 << (10*7)
    YB                                   // 1 << (10*8)
)  

常量还可以定义类型:

 type Uu8 Uint8
const(
  a Uu8=iota
  b
  c
)  

如果一个函数的入参是Uint8,则是不能使用a作为入参的。例如:

 func  thisfun(Uint x){}
thisfun(a){}  //编译错误  

编译器检查发现类型错误,如果强制类型转换则可以。

 thisfun(Uint8(a)){}  

相关文章