Как обращаться с типом итератора? - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть следующий фрагмент кода:

func generateBoard() {
    for i := 0; i < 64; i++ {

    }
}

func getRank(i int) uint8 {
    return i / 8
}

В цикле я хочу позвонить getRank(i).Я хочу getRank вернуть uint8, потому что это наименее целочисленный тип, и мне не нужно больше.Проблема в том, что я не могу разделить int на uint8.Я не хочу приводить i к uint8, потому что это может быть дорого (возможно, даже распределение там происходит).Также я не хочу объявлять i как uint8 перед циклом, например:

var i uint8
for i = 0; i < 64; i++ {

Причина Я считаю, что на низкоуровневом уровне инициализация итератора в цикле довольно оптимизирована и объявляет итератор передбыло бы также не лучшим решением.
Какова будет лучшая реализация этого?

1 Ответ

0 голосов
/ 24 февраля 2019

Вы можете объявить getRank() для получения значения типа uint8, а также можете использовать типизированную константу при объявлении переменной цикла, поэтому i будет иметь тип uint8:

func generateBoard() {
    for i := uint8(0); i < 64; i++ {
        fmt.Println(getRank(i)) // Valid
    }
}

func getRank(i uint8) uint8 {
    return i / 8
}

Попробуйте на Go Playground .

Вы также можете использовать оператор сдвига вместо деления на 8:

func getRank(i uint8) uint8 {
    return i >> 3
}

Но это микро-оптимизация, которая, скорее всего, также распознается и используется компилятором.Так что используйте тот, который более выразителен в вашем контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...