我可以在golang的for-range迭代中创建索引int64吗?

时间:2016-01-15 12:32:15

标签: arrays for-loop go slice

根据spec

for idx, val range a_slice 

语句将idx作为integer返回。

由于创建大尺寸切片为possible,是否有机会idx int64

谢谢。

1 个答案:

答案 0 :(得分:5)

不,spec specifies如果您使用"为"则为int的索引类型声明带有"范围"子句:

Range expression                          1st value          2nd value

array or slice  a  [n]E, *[n]E, or []E    index    i  int    a[i]       E
string          s  string type            index    i  int    see below  rune
map             m  map[K]V                key      k  K      m[k]       V
channel         c  chan E, <-chan E       element  e  E

你无能为力,也没有什么可以做的。切片/数组的长度将适合int

不可能使切片大于max int。尝试使用常量表达式创建更大的切片是编译时错误:

x := make([]struct{}, 3123456789)

编译时错误:len argument too large in make([]struct {})

注意:int的大小是特定于实现的:它是32位或64位。此处产生错误的常量表达式适用于32位int s(Go Playground使用32位int)。

如果length是运行时表达式,则会发生恐慌:

i := uint(3123456789)
y := make([]struct{}, i)

运行时错误:panic: runtime error: makeslice: len out of range

数组类型的长度也必须符合intSpec: Array types:

  

长度是数组类型的一部分;它必须使用int类型的值来评估为非负constant

尝试使用更大的长度是编译时错误:

var x [3123456789]struct{}
type t1 [3123456789]byte
type t2 [3123456789]struct{}

所有编译时错误:array bound is too large