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

Shu*_*uan 2 arrays for-loop go slice

按照规范

for idx, val range a_slice 
Run Code Online (Sandbox Code Playgroud)

语句返回idxinteger.

由于制作大尺寸片是可能的,是有办法的机会idxint64

谢谢.

icz*_*cza 5

不,规范指定int如果使用带有"range"子句的"for"语句的索引类型:

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
Run Code Online (Sandbox Code Playgroud)

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

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

x := make([]struct{}, 3123456789)
Run Code Online (Sandbox Code Playgroud)

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

注意:大小int是特定于实现的:它是32位还是64位.这里产生错误的常量表达式是32位ints(Go Playground使用32位ints).

如果length是运行时表达式,则会发生以下情况:

i := uint(3123456789)
y := make([]struct{}, i)
Run Code Online (Sandbox Code Playgroud)

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

并且数组类型的长度也必须适合int:规范:数组类型:

长度是数组类型的一部分; 它必须求值为可由类型值表示的非负常量int.

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

var x [3123456789]struct{}
type t1 [3123456789]byte
type t2 [3123456789]struct{}
Run Code Online (Sandbox Code Playgroud)

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