我想制作一些像这样的简单循环:
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
的{{1}}类型没有检查uint32
,我怎么能打破这个循环?
答案 0 :(得分:3)
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)
}
或者将循环变量的范围向上移动一个,这样您就可以测试i >= 1
或i > 0
:
for i := uint32(32); i > 0; i-- {
fmt.Println(i-1)
}