【问题标题】:How to declare uint8 in for-loop initialization, as var is not allowed in for loop initialization如何在for循环初始化中声明uint8,因为在for循环初始化中不允许使用var
【发布时间】:2019-04-03 03:05:59
【问题描述】:

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

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))]

导致问题。因为移位运算符 &gt;&gt; 只需要无符号整数,但表达式 i*8 会导致 int 内部为 signed int32

由于var不能用于for初始化。

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

语法错误:初始化器中不允许 var 声明

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

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

【问题讨论】:

    标签: go


    【解决方案1】:

    The Go Programming Language Specification

    Variable declarations

    ... 每个变量都被赋予对应的类型 赋值中的初始化值。


    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
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    • 2011-04-02
    相关资源
    最近更新 更多