Как объявить uint8 в инициализации цикла for, так как var не разрешен для инициализации цикла - PullRequest
0 голосов
/ 30 октября 2018

Я пишу следующий код для расчета количества населения, как показано ниже:

package main

import (
    "fmt"
)

func main() {
    var pc [256]byte

    for i := range pc {
        pc[i] = pc[i/2] + byte(i&1)
    }

    var x uint64 = 65535
    var population uint8

    for i := 0; i < 8; i++ {
        population  = population + pc[byte(x>>(i*8))]
    }

    fmt.Printf("Population Count: %d", population)
}

При компиляции я получаю следующую ошибку:

prog.go: 19: 39: недопустимая операция: x >> (i * 8) (тип счетчика сдвигов int, должно быть целое число без знака)

Проблема в переменной i, которая объявляется при инициализации цикла for. Сокращенная инициализация i делает его типом int, который внутренне имеет тип signed int32. Вот почему следующая строка:

population  = population + pc[byte(x>>(i*8))]

вызывает проблему. Поскольку оператор сдвига >> ожидает только целое число без знака, но выражение i*8 приводит к int, который внутренне signed int32.

Поскольку var не может использоваться при инициализации for.

for var i uint8 = 0; i < 8; i++ { ... }

синтаксическая ошибка: не допускается объявление var для инициализатора

Я могу объявить переменную i за пределами for loop, но я не нахожу ее чистой и удобочитаемой.

Каким должен быть чистый способ добиться того же?

1 Ответ

0 голосов
/ 30 октября 2018

Спецификация языка программирования Go

Объявления переменных

... каждой переменной присваивается тип соответствующей значение инициализации в присваивании.


i := uint(0). Например,

package main

import (
    "fmt"
)

func main() {
    var pc [256]byte

    for i := range pc {
        pc[i] = pc[i/2] + byte(i&1)
    }

    var x uint64 = 65535
    var population uint8

    for i := uint(0); i < 8; i++ {
        population = population + pc[byte(x>>(i*8))]
    }

    fmt.Printf("Population Count: %d", population)
}

Детская площадка: https://play.golang.org/p/H_4cn9w_dOq

Выход:

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