You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go规范中无类型常量索引赋予int类型规则含义及相关疑问

Go索引表达式规则问题解答

首先明确Go语言规范中,非map类型的索引表达式a[x]的相关规则:

若a不是map:

  • 索引x必须为整数类型或无类型常量
  • 常量索引必须非负,且可以用int类型的值表示
  • 无类型的常量索引会被赋予int类型
  • 若满足0 <= x < len(a)则索引x在合法范围内,否则为越界

「无类型的常量索引会被赋予int类型」的含义

Go语言中的字面量常量如果没有显式声明类型(例如1、3.14、'a'这类写法),就属于无类型常量,本身没有固定的底层类型,会根据使用场景自动推导适配类型。
这条规则的作用是明确索引场景下的无类型常量默认推导规则:当无类型常量被用作非map类型的索引时,编译器会默认将该常量的类型推导为int,而非其他整数类型(如uint、int64等)。


合法表达式a[1.0]是否与规则冲突

答案是完全不冲突,原因如下:

  1. 1.0属于无类型浮点常量,符合第一条规则「索引必须为整数类型或无类型常量」的要求
  2. 1.0的数值为整数1,没有小数部分,既满足非负要求,也能被int类型完整表示,符合第二条规则的要求
  3. 按照第三条规则,编译器会自动将符合转换要求的1.0转换为int类型的1,最终执行的逻辑等价于a[1],完全符合规范要求

补充边界情况说明

以下场景会触发编译器报错:

  • 无类型浮点常量存在小数部分,例如a[1.5],无法无损转换为int类型
  • 使用有类型的浮点值作为索引,例如const x float64 = 1.0; a[x],此时x不属于无类型常量也不属于整数类型,不符合第一条规则要求

内容的提问来源于stack exchange,提问作者AksenovAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 20:18:04