为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
阿波罗的战车 2021-12-07 10:34:08
按照规范的for idx, val range a_slice语句返回idx为integer.由于制作大尺寸片是可能的,是有办法的机会idx来int64?谢谢你。
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

不,如果您使用带有“range”子句的“for”语句,规范指定了索引的类型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的(Go Playground 使用 32 位int)。


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


i := uint(3123456789)

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

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


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


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


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


var x [3123456789]struct{}

type t1 [3123456789]byte

type t2 [3123456789]struct{}

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


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 221 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信