Я пишу следующий код для расчета количества населения, как показано ниже:
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
, но я не нахожу ее чистой и удобочитаемой.
Каким должен быть чистый способ добиться того же?