什么是Go数组索引?

时间:2012-07-03 20:36:44

标签: go

我是一些'内存分配器'类型代码,通过使用数组和索引而不是指针。我希望数组索引的大小小于指针。我关心因为我将“指针”存储为数组中的整数索引而不是64位指针。

我在Go规范中看不到任何说明数组索引的内容。显然它是某种整数。传递非常大的值会使运行时抱怨我无法传递负数,所以我猜它是以某种方式转换为有符号整数。那是int32吗?我猜它不是int64,因为我没有触及顶部位(对于负数而言,这可能是2的恭维)。

3 个答案:

答案 0 :(得分:4)

可以使用任何整数类型索引数组。

Array typesGo Programming Language Specification部分表示在数组类型定义中

  

长度是数组类型的一部分,必须是常量   表达式,其值为非负整数值。

a[x]中,例如x

  

0 <= x < len(a)必须是整数值且len

但索引的幅度存在限制; index expression的描述说:

  

内置函数capint接受各种类型的参数   返回类型int的结果。实施保证了   结果总是适合int

因此,声明的数组大小或索引表达式中的索引可以是Length and capacity uintuintptrint8,{{1 }},int16int32int64uint8uint16uint32uint64),但必须是非负数且在int类型的范围内(与int32int64的大小相同 - 尽管它与其中任何一种都不同)。

答案 1 :(得分:2)

这确实是一个非常有趣的问题。我也没有在文档中找到任何直接规则;相反,我在群组中发现了两个很棒的讨论。

the first one中,我发现答案为什么索引实现为int - 而不是uint

  

算法可以从表达负偏移的能力中受益   等等。如果索引未签名,则始终需要转换   这些案件。

The second one专门讨论了对大型数组使用int64的可能性(但仅限于可能!),提到了lencap函数的限制(实际上这些限制是{文档中的{3}}:

  

内置函数len和cap接受各种类型的参数   返回int类型的结果。实施保证了   结果总是适合int。

但是,我确实同意,更多......官方的观点不会受到伤害。 )

答案 2 :(得分:1)

数组和切片由int索引。 int被定义为32位或64位有符号整数。最常见的实现(6g)使用32位整数,而不管此时的架构如何。但是,计划最终在64位机器上int为64位,因此长度与指针相同。

语言规范定义了3种依赖于实现的数字类型:

uint     either 32 or 64 bits
int      same size as uint
uintptr  an unsigned integer large enough to store the uninterpreted bits of a pointer value