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

“非类型化的常量索引给定类型 int”是什么意思?

“非类型化的常量索引给定类型 int”是什么意思?

Go
犯罪嫌疑人X 2022-10-04 19:46:13
Go 规范给出了索引表达式的规则:a[x]如果不是地图:a索引 x 必须是整数类型或非类型化常量常量索引必须是非负的,并且可由 int 类型的值表示非类型化的常量索引被指定为 int 类型如果 0 <= x < len(a),则索引 x 在范围内,否则超出范围第三条规则(非类型化的常量索引给定类型 int)究竟是什么意思?有效的表达式是否与该规则相矛盾?a[1.0]
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

运行时使用的每个值都必须具有类型。如果使用非类型化常量,它将转换为类型化值,如以下示例所示:

fmt.Printf("%T %v", 1, 1)

1是一个非类型化常量,但当传递给 时,它必须转换为类型化值。在上面的示例中,将使用其默认类型,即 ,因此上面的示例打印 。fmt.Printf()intint 1

  • 非类型化的常量索引被指定为类型int

这意味着,如果对非类型化索引使用常量值(它没有类型),则在将常量转换为类型化值时将使用常量值。int

例如:

s := []int{1, 2, 3}
fmt.Println(s[1])

此处,非类型化常量用作索引,因此它将被转换/用作 。1int

一个反例:

fmt.Println(s[int32(1)])

此处使用类型化值 进行索引。这是有效的,因为它是整数类型。sint32(1)int32

该规则只是说,如果您使用非类型化常量,那么它将被指定为类型,而不是例如。intint32

这在使用整数文本时似乎很明显,但在使用其他类型的文本(如符文文本)时则不然。

以下内容也有效:

fmt.Println(s['\x00'])

上面的示例使用符文文本作为索引,该索引也是一个非类型化常量,但它具有不同的默认类型。符文文本的默认类型是 的别名。引用的索引规则指出,在这种情况下,索引将是类型而不是 。'\x00'runeint32intint32


查看完整回答
反对 回复 2022-10-04
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

事实并非如此。 并且是相同的数字(在数学上),因此可以为无类型化常量指定类型。1.011.0int

但是,如果您尝试指定 ,您将收到一个错误,因为它不是整数。a[1.5]1.5

操场


查看完整回答
反对 回复 2022-10-04
  • 2 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

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