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.0属于无类型浮点常量,符合第一条规则「索引必须为整数类型或无类型常量」的要求1.0的数值为整数1,没有小数部分,既满足非负要求,也能被int类型完整表示,符合第二条规则的要求- 按照第三条规则,编译器会自动将符合转换要求的
1.0转换为int类型的1,最终执行的逻辑等价于a[1],完全符合规范要求
补充边界情况说明
以下场景会触发编译器报错:
- 无类型浮点常量存在小数部分,例如
a[1.5],无法无损转换为int类型 - 使用有类型的浮点值作为索引,例如
const x float64 = 1.0; a[x],此时x不属于无类型常量也不属于整数类型,不符合第一条规则要求
内容的提问来源于stack exchange,提问作者AksenovAN
相关产品推荐
相关产品推荐

