2013-01-06 36 views
4

编辑这是由于我的一个愚蠢的错误,但这个问题值得保留,以防其他人这样做。超越uint8切片的距离?

我希望这个作品:

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的“参数化类型” *,在这种情况下uint8int

我是否抓住了棍子的错误末端?是否有一些我错过的文档?或者我真的不能迭代uint8切片与uint8变量?

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

回答

6

range返回在那个位置的索引的集合,并且可能的值:

range keyword The range keyword allows you to iterate over items of a list like an array or a map. For understanding it, you could translate the range keyword to for each index of. When used with arrays and slices, it returns the integer index of the item. (tutorial)

示例代码:

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会让围棋的做法不太奇怪:

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

那是愚蠢的。我知道。忘了。谢谢! – Joe

+0

@Joe - 不用客气,我添加了JavaScript样本,因为我经常忘记“它”而不是语言。 –