一尘不染

Golang中For循环的歧义行为

go

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

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``if i == 0


阅读 174

收藏
2020-07-02

共1个答案

一尘不染

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)
}
2020-07-02