【发布时间】: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 < 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