【问题标题】:Can I make the index int64 in golang's for-range iteration?我可以在 golang for-range 迭代中创建索引 int64 吗?
【发布时间】:2016-04-21 01:16:00
【问题描述】:

根据spec

for idx, val range a_slice 

语句以integer 的形式返回idx。

既然创建大尺寸切片是possible,有没有办法将idx 变成int64?

谢谢。

【问题讨论】:

  • integer 不是 Go 类型。确实是int。 int 是 32 位或 64 位,具体取决于平台,这意味着如果您的切片大到需要 64 位索引,则意味着您在 64 位平台上,因此 int 的大小实际上与int64.
  • @SirDarius 这实际上是一个答案而不是评论。
  • @GrzegorzŻur 不,问题是是否可以使用 int64 类型作为索引,我没有解决这个问题。我只是指出 int 和 int64 在这种情况下基本相同,质疑问题的相关性。不要忘记,即使 int 和 int64 可能具有相同的大小,规范也很清楚它们被视为不同的类型。
  • 我会接受 icza 的回答,但第一条评论是最有帮助的 :)

标签: arrays for-loop go slice


【解决方案1】:

不,如果您使用带有“range”子句的“for”语句,则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。

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

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

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

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

如果 length 是一个运行时表达式,它会恐慌:

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

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

并且数组类型的长度也必须适合int:Spec: Array types:

长度是数组类型的一部分;它必须评估为非负的constant,可以用int 类型的值表示。

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

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

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

【讨论】:

  • 根据规范,索引始终不是负数。所以,理论上,它应该是 uint。
  • @db_ int 是通用的整数类型,在 go 中你不能对不同类型的值进行操作。例如。如果你写j := 3,它将有一个int的类型,你不能写i + j而不必先转换索引,例如int(i) + j.
猜你喜欢
  • 2019-06-27
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
  • 1970-01-01
  • 2014-09-14
  • 2013-07-29
  • 1970-01-01
相关资源
最近更新 更多