Golang中For循环的模糊行为

时间:2018-06-13 07:55:13

标签: for-loop 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的类型为uint32,则此循环无穷无尽。如果iint32,则表示没问题。

如果i的{​​{1}}类型没有检查uint32,我怎么能打破这个循环?

1 个答案:

答案 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 >= 1i > 0

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