作者:pop6959140 | 来源:互联网 | 2024-11-14 13:14
在下面的代码片段中:
const (
signature uint32 = 0xae3179fb
dhkxGroup = 2
ReplySuccessful byte = iota
ReplyBufferCorrupted
ReplyDecryptFailed
ReplySessionExpired
ReplyPending
)
ReplySuccessful
被编译成2
,而我认为它应该是零。如果我将signature
和dhkxGroup
移到ReplyPending
之后,ReplySuccessful
就会变成0。
为什么会这样呢?
对于我来说,使用iota的主要优势在于它可以省去后续常量的赋值,从而方便地进行修改或插入新值。然而,如果iota的初始值不是固定的零,这可能会在处理通信协议等任务时引发严重的问题。
解答
根据Go语言的规范,iota的定义如下(强调部分已添加):
在常量声明中,预声明的标识符iota表示连续的无类型整数常量。其值是从零开始的当前常量声明中相应ConstSpec的索引。
需要注意的是,索引是相对于ConstSpec
的,即当前的const
块。
一个特别有趣的例子是:
const (
a = 1 < b = 1 < c = 3 // c == 3 (iota == 2, unused)
d = 1 <)
注意第3行(iota值为2)没有被使用。您的代码中也类似,前两个值没有被使用。
您可能希望代码如下所示:
const (
signature uint32 = 0xae3179fb
dhkxGroup = 2
)
const (
ReplySuccessful byte = iota
ReplyBufferCorrupted
ReplyDecryptFailed
ReplySessionExpired
ReplyPending
)
这样,ReplySuccessful
将会被正确地初始化为0。您可以在Go Playground上查看这个示例。