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()
int
int 1
非类型化的常量索引被指定为类型
int
这意味着,如果对非类型化索引使用常量值(它没有类型),则在将常量转换为类型化值时将使用常量值。int
例如:
s := []int{1, 2, 3} fmt.Println(s[1])
此处,非类型化常量用作索引,因此它将被转换/用作 。1
int
一个反例:
fmt.Println(s[int32(1)])
此处使用类型化值 进行索引。这是有效的,因为它是整数类型。s
int32(1)
int32
该规则只是说,如果您使用非类型化常量,那么它将被指定为类型,而不是例如。int
int32
这在使用整数文本时似乎很明显,但在使用其他类型的文本(如符文文本)时则不然。
以下内容也有效:
fmt.Println(s['\x00'])
上面的示例使用符文文本作为索引,该索引也是一个非类型化常量,但它具有不同的默认类型。符文文本的默认类型是 的别名。引用的索引规则指出,在这种情况下,索引将是类型而不是 。'\x00'
rune
int32
int
int32
- 2 回答
- 0 关注
- 80 浏览
添加回答
举报
0/150
提交
取消