Golang 中 For 循环的不明确行为



我想做一些像这样的简单循环:

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.如果iint32没关系。

如果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 >= 1i > 0

for i := uint32(32); i > 0; i-- {
fmt.Println(i-1)
}

最新更新