iota的确切含义是什么?
在下面的代码中:
const (
signature uint32 = 0xae3179fb
dhkxGroup = 2
ReplySuccessful byte = iota
ReplyBufferCorrupted
ReplyDecryptFailed
ReplySessionExpired
ReplyPending
)
ReplySuccessful被编译成2,而我认为它应该definitly是零。如果我移动signature并dhkxGroup低于ReplyPending,则ReplySuccessful变为 0。
为什么是这样?
附注。对我来说,使用 iota 的唯一“好处”是您可以省略分配给以后常量的值,以便您可以轻松修改/插入新值。但是,如果 iota 没有固定为零,则可能会导致大问题,尤其是在执行诸如通信协议之类的事情时。
回答
该规范定义了 iota 在 Go 中的用法(强调了添加):
在常量声明中,预先声明的标识符 iota 表示连续的无类型整数常量。它的值是该常量声明中相应ConstSpec的索引,从零开始。
请注意,索引是相对于 的ConstSpec,基本上表示当前const块。
特别感兴趣的可能是提供的示例:
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 行(iota 值 2)未使用。您基本上是相同的,首先是两个未使用的值。
您在代码中的意思可能是:
const (
signature uint32 = 0xae3179fb
dhkxGroup = 2
)
const (
ReplySuccessful byte = iota
ReplyBufferCorrupted
ReplyDecryptFailed
ReplySessionExpired
ReplyPending
)
在操场上看到它