3

在下面的代码中:

const (
    signature uint32 = 0xae3179fb
    dhkxGroup = 2

    ReplySuccessful byte = iota
    ReplyBufferCorrupted
    ReplyDecryptFailed
    ReplySessionExpired
    ReplyPending
)

ReplySuccessful编译为2,而我认为它肯定应该为零。如果我移动signaturedhkxGroup低于ReplyPending,则ReplySuccessful变为 0。

为什么是这样?

PS。对我来说,使用 iota 的唯一“好处”是您可以省略分配给以后常量的值,以便您可以轻松修改/插入新值。但是,如果 iota 不固定为零,则可能会导致大问题,尤其是在处理通信协议之类的事情时。

4

1 回答 1

5

规范定义了 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
)

在操场上看

于 2021-07-12T10:16:50.400 回答