遍历 uint8 切片的 Go 语言范围?

4

编辑:这是我的一个愚蠢错误,但这个问题值得保留,以防其他人也犯同样的错误。

我希望这个能够起作用:

var xs []uint8
var x uint8
for x = range xs {

}

但是我遇到了错误:
cannot assign type int to x (type uint8) in range

我理解的是,即使它操作的是uint8切片,range仍然试图将int用作迭代值。

我查阅了语言规范,相关部分如下:

Range expression                          1st value          2nd value (if 2nd variable is present)

array or slice  a  [n]E, *[n]E, or []E    index    i  int    a[i]       E

所以我期望它是E这个“参数化类型”,在这种情况下是uint8而不是int

我是否理解错了?有一些文档我错过了吗?或者我真的无法使用uint8变量遍历uint8切片吗?

*我知道它实际上不是一个通用的参数化类型。

1个回答

6

range 函数返回集合中的索引及可能的值:

range 关键字 允许你迭代类似数组或映射的列表。为了更好地理解它,你可以把 range 关键字翻译成 对于每个索引。当用于数组和切片时,它会返回该项的整数索引。 (教程)

示例代码:

package main

import "fmt"

func main() {
    var xs []uint8 = []uint8{255, 254, 253}
    var idx int
    var ui8 uint8
    for idx, ui8 = range xs {
        fmt.Println(idx, ui8)
    }
}

输出:

0 255
1 254
2 253

附言:

也许了解JavaScript会让人们更容易理解Go的方法:

% a = [255, 254, 253]
255,254,253
% for (x in a) { print(x, " ", a[x]); }
0 255
1 254
2 253

@Joe - 欢迎您;我添加了Javascript示例,因为我经常在那种语言中忘记它。 - Ekkehard.Horner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接