我是一些'内存分配器'类型代码,通过使用数组和索引而不是指针。我希望数组索引的大小小于指针。我关心因为我将“指针”存储为数组中的整数索引而不是64位指针。
我在Go规范中看不到任何说明数组索引的内容。显然它是某种整数。传递非常大的值会使运行时抱怨我无法传递负数,所以我猜它是以某种方式转换为有符号整数。那是int32
吗?我猜它不是int64
,因为我没有触及顶部位(对于负数而言,这可能是2的恭维)。
答案 0 :(得分:4)
可以使用任何整数类型索引数组。
Array types的Go Programming Language Specification部分表示在数组类型定义中
长度是数组类型的一部分,必须是常量 表达式,其值为非负整数值。
在a[x]
中,例如x
:
0 <= x < len(a)
必须是整数值且len
但索引的幅度存在限制; index expression的描述说:
内置函数
cap
和int
接受各种类型的参数 返回类型int
的结果。实施保证了 结果总是适合int
。
因此,声明的数组大小或索引表达式中的索引可以是Length and capacity uint
,uintptr
,int8
,{{1 }},int16
,int32
,int64
,uint8
,uint16
,uint32
,uint64
),但必须是非负数且在int
类型的范围内(与int32
或int64
的大小相同 - 尽管它与其中任何一种都不同)。
答案 1 :(得分:2)
这确实是一个非常有趣的问题。我也没有在文档中找到任何直接规则;相反,我在群组中发现了两个很棒的讨论。
在the first one中,我发现答案为什么索引实现为int
- 而不是uint
:
算法可以从表达负偏移的能力中受益 等等。如果索引未签名,则始终需要转换 这些案件。
The second one专门讨论了对大型数组使用int64
的可能性(但仅限于可能!),提到了len
和cap
函数的限制(实际上这些限制是{文档中的{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