猿问

如何在 for 循环初始化中声明 uint8,因为在 for 循环初始化中不允许使用 var

我正在编写以下代码来计算人口数量,如下所示:


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是 internally signed int32。


因为var不能在for初始化时使用。


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

语法错误:初始化程序中不允许使用 var 声明


i我可以在 之外声明变量for loop,但我发现它不干净且可读。


实现相同目标的干净方法应该是什么?


九州编程
浏览 98回答 1
1回答

明月笑刀无情

Go 编程语言规范变量声明...每个变量在赋值中被赋予相应初始化值的类型。i := uint(0). 例如,package mainimport (    "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)}输出:Population Count: 16
随时随地看视频慕课网APP

相关分类

Go
我要回答