我编写以下代码来计算人口数如下:
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))]是造成问题的原因。因为shift运算符>>只期望无符号整数,但是表达式i*8会将结果转化为内部signed int32的int。
由于var不能用于for初始化。
for var i uint8 = 0; i < 8; i++ { ... }语法错误:初始化器不允许var声明
我可以在i之外声明变量for loop,但是我发现它没有干净可读性。
实现同样目标的清洁方式应该是什么?
发布于 2018-10-30 05:49:54
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)
}操场:dOq
输出:
Population Count: 16https://stackoverflow.com/questions/53058108
复制相似问题