为什么字节切片的元素在 Go 中以整数形式返回?

Why are Elements of Byte Slices Returned as Ints in Go?

在运动场上,此代码

package main

import (
    "fmt"
)

var a = []byte{ 0xff, 0xaa, 0x66, 0x33, 0x00 }

func main() {
    for b := range a {
        fmt.Printf("%T\n", b)
    }
}

打印

int
int
int
int
int

当你遍历它时(或者至少是 uint8 或其他东西),为什么一个字节片不会给你字节?

这是去游乐场的 link:https://play.golang.org/p/V1uZZWWq-X

不是 slice/bytes/strings/runes 引起的问题。这是你的使用范围。您期望查看当前项,但实际上您查看的是表示循环每次迭代中的当前索引的整数。

明确地说,如果你的循环形式是; for i, v := range 然后 i 是一个表示当前索引的 int,而 v 是一个临时存储块,索引 i 处的值被分配给了该块。如果您只想要这些值,那么您的循环就是; for _, v := range。当左边只有一个标识符时,它分配的是索引,而不是值。

for i := range thingi 设置为事物的索引(不同于 Python 等)。 for i, b := range byteslice 会将 index 放入 i 并将字节放入 b,而 for _, b := range byteslice 只会将字节放入 b ].

The spec on for statements 列出了与 range 表达式(包括字符串、通道和映射)相关的所有不同特殊情况。