Неоднозначное поведение цикла For в Голанге - PullRequest
0 голосов
/ 13 июня 2018

Я хочу создать простой цикл, подобный следующему:

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.Если i равно int32, это нормально.

Как я могу разорвать этот цикл, если i имеет тип uint32 без проверки if i == 0?

1 Ответ

0 голосов
/ 13 июня 2018

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...