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)
)
中,<< 表示什么。
谢谢。我现在明白了。
更多关于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

