• go的常量自增iota


    iota,一个很奇怪的英文单词,一直想弄清楚其中文含义,但经过查证,它并不是英文缩写,而是一个完整的希腊单词,没有具体意思,常做为数学符号使用。

    1. 常见用法
    iota主要用于常量自增,如下面一个很常见的例子,当iota赋值给常数A后,第一个常数A值为0,后面的常数会自动加1:

    const (
    A = iota // 0
    B // 1
    C // 2
    )

    还可以给常量声明一个类型,如下:

    type Alpa int

    const (
    A Alpa = iota // 0
    B // 1
    C // 2
    )

    有时想定义的常量值不连续或保留某些值,可以使用_跳过。如下:

    const (
    A = iota // 0
    _
    B // 2
    C // 3
    )

    可以看到B值为2,跳过了1。

    2. 非常见用法
    初识iota时,一直以为iota赋值的第一个常量为0,往后逐个自增,但后来见到的一些奇怪用法,让我知道iota并没有那么简单。下面展示了一些非常见用法:

    示例1:

    const (
    A = 1
    B = iota
    C
    )

    B,C的值分别是多少?

    示例2:

    const (
    A = 1 << iota
    B
    C
    )

    B,C的值分别是多少?

    示例3:

    const (
    A, B = iota+1, iota+2
    C, D
    E, F
    )

    A,B,C,D,E,F的值分别是多少?

    示例4:

    const (
    A = iota
    B = 3
    C
    D
    )

    C,D的值分别是多少?

    示列5:

    const (
    A = -(iota)
    B
    C
    )
    B,C的值分别是多少?

    答案:
    示例1:B=1,C=2
    示例2:B=2,C=4
    示例3:A=1,B=2,C=2,D=3,E=3,F=4
    示例4:C=3,D=3
    示例5:B=-1,C=-2

    对照上面答案,如果这些你都能做对,说明你完全了解了iota求值方法,后面的不需要看了,如果不是很确定,有点模糊,或已经崩溃,那么下面的会对你非常有帮助。

    3. iota计算规则
    为了更好了解iota计算规则,我们先要知道一些概念。

    3.1 iota 作用范围
    iota的作用范围仅限于自已所在的const声明,多个const都使用iota会不会互相影响。如下示例:

    const (
    A1 = iota // 0
    A2 // 1
    A3 // 2
    )

    const (
    B0 = iota // 0
    B1 // 1
    c2 // 2
    )
    两个const里面的常量并没有互相影响。

    3.2 常量编号
    在一个const下,每一个的常量都有一个编号,但这个编号并不是常量的顺序号,而是const内部的行号,行号从0开始。如何理解,请看下面示例:

    const (
    A = iota // 0
    _ // 1
    B // 2
    C // 3
    )
    常量A在const内部行号为0,因此编号也为0;常量B在const内部行号为2,因此编号也为2。

    再举个例子:

    const (
    A, B = iota+1, iota+2 // A行号=0,B行号=0
    C, D // C行号=1,D行号=1
    E, F // E行号=2,F行号=2
    )
    常量A, B在const内部行号为0,因此编号都为0;常量C, D在const内部行号为1,因此编号都为1。可以看出常量编号并非常量的顺序号。

    谨记编号是常量所在const内部的行号。

    3.3 常量表达式
    等号右边的是表达式

    常量名 = 表达式

    const (
    A = iota
    B = 1 << iota
    C = -(iota)
    D = iota*10
    )
    常量A的表达式为:iota
    常量B的表达式为:1 << iota
    常量C的表达式为:-(iota)
    常量D的表达式为:iota*10

    3.4 表达式惯性
    如果常量没有表达式,会继承它上面常量的表达式。第一个常量必须有表达式,否则会编译失败。示例如下:

    const (
    A = iota
    B
    C = 3
    D
    E = iota << 1
    F
    G
    )
    如果把上面所有常量表达式补齐,会变成:

    const (
    A = iota
    B = iota
    C = 3
    D = 3
    E = iota << 1
    F = iota << 1
    )
    常量B会继承常量A的表达式;常量D会继承常量C的表达式;常量F会继承常量E的表达式;常量G会继承常量F的表达式,由于F继承了E的,那相当于G也继承了E的表达式。

    第一个常量必须有表达式,如果没有会报错,因为它没有可以继承的,如下:

    A
    B = iota
    报错:missing constant value

    对于一行多个常量,也遵循表达式惯性规律:C继承A, E继承C,D继承B, F继承D。

    const (
    A, B = iota+1, iota+2
    C, D
    E, F
    )

    常量表达式补齐,会变成:

    const (
    A, B = iota+1, iota+2
    C, D = iota+1, iota+2
    E, F = iota+1, iota+2
    )

    A,B都要有表达式,任何一个没有都会报错。

    如果有用到表达式惯性规则,则每一行必须有相同的常量数,否则会报错,如下:

    const (
    A, B, C = iota+1, iota+2, iota+3
    D, E
    )

    报错:extra expression in const declaration

    但如果没有用到表达式惯性规则,则不会有问题,如下:

    const (
    A, B, C = iota+1, iota+2, iota+3
    D, E = iota+3, iota+3
    )

    编译成功,没问题。

    3.5 常量值计算公式
    上面对iota的一些基本概念介绍清楚了,下面进入正题–iota的值到底是怎么算的?其实很简单,把表达式中的iota替换成常量编号进行计算即可。

    如上面介绍表达式例子:

    const (
    A = iota
    B = 1 << iota
    C = -(iota)
    D = iota*10
    )

    常量A的表达式为:iota,编号为0,将编号替换表达式的iota,表达式为0,最后A的值为0。
    常量B的表达式为:1 << iota,编号为1,将编号替换表达式的iota,表达式为1<<1,B的值为2。
    常量C的表达式为:-(iota),编号为2,将编号替换表达式的iota,表达式为-(2),B的值为-2。
    常量D的表达式为:iota*10,编号为3,将编号替换表达式的iota,表达式为```3*10``,B的值为30。

    通过程序验证结果与上面完全符号。

    再验证一个:

    const (
    A, B = iota+1, iota+2
    C, D
    )

    常量A的表达式为:iota+1,A的编号为0,将编号替换表达式的iota,表达式为0+1,A的值为1。
    常量B的表达式为:iota+2,B的编号为0,将编号替换表达式的iota,表达式为0+2,B的值为2。
    常量C的表达式为:iota+1,C的编号为1,将编号替换表达式的iota,表达式为1+1,C的值为2。
    常量D的表达式为:iota+2,D的编号为1,将编号替换表达式的iota,表达式为1+2,D的值为3。

    程序验证:


    了解了iota计算规则后,再也不会有常量值弄不清的问题了

    原文链接:https://blog.csdn.net/fengshenyun/article/details/103158576

  • 相关阅读:
    约合¥1720 LG法国称G Watch将于6月开卖
    c语言中的位移位操作
    兼容的动态加载JS【原】
    Oracle 10g AND Oracle 11g手工建库案例--Oracle 10g
    面向对象思想----不看懊悔!
    学习设计模式--观察者模式(C++)
    使用POI 导入excel
    机器学习 F1-Score, recall, precision
    阿里无线11.11:手机淘宝移动端接入网关基础架构演进之路
    ICE 迁移64位安装问题
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/16007336.html
Copyright © 2020-2023  润新知