go 关于数值常量允许转换为字符串的不一致性

kx5bkwkv  于 6个月前  发布在  Go
关注(0)|答案(8)|浏览(61)

在"转换"部分,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

s1ag04yj

s1ag04yj2#

如果常量移位表达式的左操作数是一个未指定类型的常量,那么结果就是一个整数常量;
这在下面的代码中表明 'a' << 1 应该是一个整数常量,因此 x 应该被赋予默认类型 int,并且赋值操作应该成功。

var x = 'a' << 1
var _ int = x


然而,cmd/compile 和 go/types 都给 `x` 赋予了类型 `rune`,所以赋值操作被拒绝。
mm5n2pyu

mm5n2pyu3#

整数常量是否包括字符常量?

x33g5p2x

x33g5p2x4#

我也认为'x'是一个整数常量。只是它的默认类型是 rune

30byixjq

30byixjq5#

runeint32 的别名,后者被定义为整数类型。然而,似乎没有任何文字表明 "rune 常量" 是 "整数常量" 的子类。

iovurdzv

iovurdzv6#

我认为 'x' 不是(尚未)是一个 rune 常量,而是一个无类型整数常量。在某些上下文中,例如在 foo := 'x' 中,它 变成了 一个 rune 。在 string('x') 中,它的默认类型( rune )在我看来并不重要。我认为实际上是在后面的情况下(由于上下文)首先转换为 int ,而不是 rune ,就像在(我个人认为)等效的 string(120) 中一样。

ssm49v7z

ssm49v7z7#

我认为'x'(目前)不是一个rune常量,而是一个无类型整数常量。
这并不是Go规范中所说的(强调部分):
一个rune字面量表示一个rune常量,一个标识Unicode码点的整数值。
Rune常量是整数值,但不是整数常量。

bvjveswy

bvjveswy8#

我同意@mdempsky的观点,即在这个领域中,规范至少存在一些不精确或不一致的地方。我们在不同的目的下使用略有相似的术语(整数值、整数常量、整数、int类型等),并且这些术语在某种程度上是模糊的。
我认为我们需要在一个地方明确定义这些术语(与现有的使用保持一致),然后这个问题(及相关问题)应该变得清晰。

相关问题