4

编辑这是由于我的一个愚蠢的错误,但这个问题值得保留,以防其他人这样做。

我希望这可行:

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

}

但我得到了错误:

cannot assign type int to x (type uint8) in range

即(据我所知)range,即使它在 的切片上运行uint8,它也试图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变量迭代切片吗?

*我知道它不是真正的通用参数化类型。

4

1 回答 1

6

range返回一个集合的索引,并可能返回该位置的值:

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

PS:

也许看看 Javascript 会让 Go 的方法不那么奇怪:

% a = [255, 254, 253]
255,254,253
% for (x in a) { print(x, " ", a[x]); }
0 255
1 254
2 253
于 2013-01-06T15:00:30.630 回答