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
, даст вам значение, где все биты равны единице: максимальное значение для 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)
}