在"转换"部分,Go规范表示:
如果常量x可以由T类型的值表示,那么可以将常量x转换为类型T。作为特殊情况,整数常量x可以使用与非常量x相同的规则转换为字符串类型。
请注意,“整数常量”与“rune常量”、“浮点常量”等是不同的。
然而,规范还包括了两个将rune字面量转换为类型string的例子:string('x')
和string('a')
。
cmd/compile和go/types允许这些转换。我认为gccgo也应该允许,因为utf8.RuneError是一个未指定的rune常量,而string(utf8.RuneError)
在标准库中出现了几次。
我认为应该修改措辞为“一个整数或rune常量x”。
另外:我认为我们应该进一步放宽限制,允许任何整数值。我们允许make([]byte, 1.0)
,所以似乎不允许string(1.0)
是不一致的。
/cc @griesemer
8条答案
按热度按时间t9aqgxwy1#
与此相关的:#21982。
s1ag04yj2#
如果常量移位表达式的左操作数是一个未指定类型的常量,那么结果就是一个整数常量;
这在下面的代码中表明
'a' << 1
应该是一个整数常量,因此x
应该被赋予默认类型int
,并且赋值操作应该成功。var x = 'a' << 1
var _ int = x
mm5n2pyu3#
整数常量是否包括字符常量?
x33g5p2x4#
我也认为'x'是一个整数常量。只是它的默认类型是
rune
。30byixjq5#
rune
是int32
的别名,后者被定义为整数类型。然而,似乎没有任何文字表明 "rune 常量" 是 "整数常量" 的子类。iovurdzv6#
我认为
'x'
不是(尚未)是一个rune
常量,而是一个无类型整数常量。在某些上下文中,例如在foo := 'x'
中,它 变成了 一个rune
。在string('x')
中,它的默认类型(rune
)在我看来并不重要。我认为实际上是在后面的情况下(由于上下文)首先转换为int
,而不是rune
,就像在(我个人认为)等效的string(120)
中一样。ssm49v7z7#
我认为'x'(目前)不是一个rune常量,而是一个无类型整数常量。
这并不是Go规范中所说的(强调部分):
一个rune字面量表示一个rune常量,一个标识Unicode码点的整数值。
Rune常量是整数值,但不是整数常量。
bvjveswy8#
我同意@mdempsky的观点,即在这个领域中,规范至少存在一些不精确或不一致的地方。我们在不同的目的下使用略有相似的术语(整数值、整数常量、整数、int类型等),并且这些术语在某种程度上是模糊的。
我认为我们需要在一个地方明确定义这些术语(与现有的使用保持一致),然后这个问题(及相关问题)应该变得清晰。