【问题标题】:Go - uint32 in for loop condition (mismatched types int and uint32)Go - for 循环条件中的 uint32(不匹配的类型 int 和 uint32)
【发布时间】:2012-11-03 06:02:38
【问题描述】:

为了类型严格,当大小不能为负时,我有时将我的大小存储为 uint。在 for 循环中使用时,我希望它看起来像这样:

var size uint32 = 8
for i := 0; i < size; {
    n := //doesn't matter how how this value is determined
    i += n
}

但是,我收到以下错误消息:invalid operation: i &lt; size (mismatched types int and uint32)

重写 for 循环以指定如下类型:

for var i uint32 = 0; i < size; {

产生此编译器错误:syntax error: var declaration not allowed in for initializer

解决这些错误的唯一方法是:

for i := 0; uint32(i) < size; {

var i uint32 = 0
for i < size {

第一个效率低下,因为我在每次迭代中都进行投射,而第二个则不那么优雅。有没有更好的方法来做到这一点?

【问题讨论】:

  • var uint32 size = 8 应该是var size uint32 = 8 类型在左值之后。
  • 已修复,谢谢。我想旧习惯很难改掉......
  • Go 不使用“cast”这个词,uint32(i) 是一种类型转换。更重要的是,在这种情况下没有效率低下。无论如何,到目前为止,go 中的 int 是 32 位的,所以这种特殊的类型转换没有运行时开销,它只会影响编译时的类型检查。此外, i := uint(0) 和 uint32(i)
  • 在这里添加“类型严格性”有什么好处?我什至很难想到使用 uint32 而不是 int 作为大小可以捕获的假设错误。
  • uint32 作为参数传入。创建的负数会导致调用者明显不打算的行为。 uint32 会产生编译时错误并通知编码人员他们犯了错误,从而更快地发现错误。稍微相关的是,大小最终通过 tcp 数据包发送,该数据包允许以相同的字节数表示更大的数字。

标签: type-conversion go


【解决方案1】:

你可以这样做:

for i := uint32(0); i < size; {
    //whatever
}

一般来说,我不建议使用无符号整数,即使大小永远不会是负数。我不知道有什么好处。我只在故意溢出时使用无符号整数。

【讨论】:

  • 据说 OP 的 size_t 类型在 C 语言中有很强的背景。
  • 或者您可以向后迭代,避免转换...for i := size - 1; i &gt;= 0; { ...引入了一个难以发现的错误,这就是无符号类型很危险的原因。
  • 使用范围操作符有没有解决办法?喜欢for i := range arr {
  • 恐怕不行。 @sinned
  • 我在循环头之后直接从索引中创建了一个单独的变量ui := uint32(i)。我想到的其他解决方案并没有那么难看...
猜你喜欢
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多