我想做一些像这样的简单循环:
package main
import "fmt"
func main() {
var i uint32 // code bellow works fine with int32
for i = 31; i >= 0; i-- {
fmt.Println(i)
}
}
但是这个循环是无止境的,如果i
有类型uint32
.如果i
int32
没关系。
如果i
有类型uint32
而不检查if i == 0
,我如何打破这个循环?
i
是uint32
类型,所以一旦达到0
,再次递减将导致最大值uint32
。更改循环条件以检查:
var i uint32 // code bellow works fine with int32
for i = 31; i != 0xffffffff; i-- {
fmt.Println(i)
}
在Go Playground上尝试一下。
或者使用math.MaxUint32
常量:
var i uint32 // code bellow works fine with int32
for i = 31; i != max.MaxUint32; i-- {
fmt.Println(i)
}
或者使用^uint32(0)
表达式,其中^
运算符是按位补码运算符,应用于0
将为您提供一个值,其中所有位都是 1:uint32
的最大值。
虽然如果你看一下代码,它并不直观,很难理解。因此,您应该使用不需要且更直接的替代方案,例如使用int32
并检查i >= 0
,或使用向上循环,例如:
for i := uint32(0); i < 32; i++ {
fmt.Println(31 - i)
}
或者用 +1 偏移循环变量的范围,以便您可以测试i >= 1
或i > 0
:
for i := uint32(32); i > 0; i-- {
fmt.Println(i-1)
}