我想做一个简单的循环,像这样:
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有type ,则此循环是无限的uint32。如果i可以的话int32。
i
uint32
int32
如果没有检查i类型,我怎么能打破这个循环?uint32``if i == 0
uint32``if i == 0
i是类型的uint32,因此一旦达到0最大值,再次递减将导致最大值uint32。更改循环条件以进行检查:
0
var i uint32 // code bellow works fine with int32 for i = 31; i != 0xffffffff; i-- { fmt.Println(i) }
在Go Playground上尝试一下。
或使用math.MaxUint32常数:
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。
^uint32(0)
^
尽管如果您看一下代码,它并不直观,很难理解。因此,您应该在不需要且更简单的地方使用替代方法,例如使用int32和检查i >= 0,或使用向上循环,例如:
i >= 0
for i := uint32(0); i < 32; i++ { fmt.Println(31 - i) }
或将循环变量的范围偏移+1,因此您可以测试i >= 1或i > 0:
i >= 1
i > 0
for i := uint32(32); i > 0; i-- { fmt.Println(i-1) }