登录
首页 >  Golang >  Go问答

在 for 循环初始化中使用 uint8 声明的方法

来源:stackoverflow

时间:2024-03-18 19:27:32 408浏览 收藏

在 Go 语言中,使用 uint8 类型的 for 循环初始化变量时,可能会遇到类型不匹配错误。这是因为 var 初始化在 for 循环中无效,导致变量 i 被隐式声明为 int 类型,与移位运算符所需的无符号整数类型不匹配。 为了解决此问题,可以在 for 循环外声明 i 并将其类型显式指定为 uint8,例如: ``` var i uint8 = 0 for i

问题内容

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

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, 必须是无符号整数)

问题出在初始化 for 循环时声明的变量 i 上。 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 声明

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

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


解决方案


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

终于介绍完啦!小伙伴们,这篇关于《在 for 循环初始化中使用 uint8 声明的方法》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>