Golang中的Iota符号解析:如何理解这个令人困惑的概念

Golang中的Iota符号解析:如何理解这个令人困惑的概念 在 const ( a = 1 << iota // a == 1 (iota == 0) b = 1 << iota // b == 2 (iota == 1) c = 3 // c == 3 (iota == 2, unused) d = 1 << iota // d == 8 (iota == 3) ) 中,<< 表示什么。

3 回复

谢谢。我现在明白了。

更多关于Golang中的Iota符号解析:如何理解这个令人困惑的概念的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一种“位移”操作。计算机以二进制形式存储数字,因此:

  • 二进制中的 0001 是十进制中的 1
  • 二进制中的 0010 是十进制中的 2
  • 二进制中的 0100 是十进制中的 4
  • 二进制中的 1000 是十进制中的 8

表达式 1 << 1 的意思是“取二进制数 1 并将其向左移动一列”,这会使它翻倍变成 2。1 << 2 的意思是将其移动两列,使其变成 4,就像上面的列表一样。

iota 是 Go 语言中的一个计数器。如果我想用英文单词表示数字而不是直接写出来,我可以这样做:

const (
  Zero = iota
  One = iota
  Two = iota
)

然后我就可以在程序中使用 One + Two 来得到 3。在实际应用中这样做有点傻,因为 1 + 2 更容易读写,但这演示了 iota 的作用。

你可以像你发布的示例中那样,将位移操作(即 <<)和 iota 结合起来,这样每一行不是递增 1,而是翻倍为 1、2、4、8、16 等。

编辑:修正拼写错误

在Go语言中,<< 是左移位运算符。在常量声明中使用 iota 时,1 << iota 表示将数字1的二进制位向左移动 iota 次。

具体解析:

  • iota 从0开始,每行自动递增
  • 1 << 0 = 1(二进制1左移0位)
  • 1 << 1 = 2(二进制1左移1位:10)
  • 1 << 3 = 8(二进制1左移3位:1000)

示例代码:

package main

import "fmt"

const (
    a = 1 << iota  // 1 << 0 = 1
    b = 1 << iota  // 1 << 1 = 2
    c = 3          // 直接赋值3
    d = 1 << iota  // 1 << 3 = 8
)

func main() {
    fmt.Printf("a = %d (二进制: %b)\n", a, a)
    fmt.Printf("b = %d (二进制: %b)\n", b, b)
    fmt.Printf("c = %d\n", c)
    fmt.Printf("d = %d (二进制: %b)\n", d, d)
}

输出:

a = 1 (二进制: 1)
b = 2 (二进制: 10)
c = 3
d = 8 (二进制: 1000)

这种模式常用于定义按位标志:

const (
    FlagA = 1 << iota  // 1 << 0 = 1 (二进制: 0001)
    FlagB              // 1 << 1 = 2 (二进制: 0010)
    FlagC              // 1 << 2 = 4 (二进制: 0100)
    FlagD              // 1 << 3 = 8 (二进制: 1000)
)

每个常量值都是2的幂,这样可以通过按位或操作组合多个标志:

flags := FlagA | FlagC  // 二进制: 0101 = 5
回到顶部