0

(我使用的是 Go 1.14.6。)

以下语句都将输出 chara

Println(string(int(97) ) )
Println(string(int32(97) ) )
Println(string([]int32{97} ) )

Println(string([]int{97} ) )

会导致编译错误

cannot convert []int literal (type []int) to type string

这种行为让我很困惑。如果处理string(int)方式相同string(int32),为什么处理string([]int)方式不同string([]int32)

4

1 回答 1

6

rune表示 unicode 代码点是int32. 如此有效地string([]int32{})string([]rune{})将一片符文(类似于 a 的字符string)转换为string. 这很有用。

intis not int32nor ,因此转换为应该是rune什么是不合逻辑的,它是模棱两可的,因此语言规范不允许这样做。[]intstring

将整数转换为string具有单个rune. 规格:转换:

与字符串类型的转换

  1. 将有符号或无符号整数值转换为字符串类型会生成一个包含整数的 UTF-8 表示形式的字符串。超出有效 Unicode 代码点范围的值将转换为"\uFFFD".

这让许多人感到困惑,因为许多人期望转换结果是(十进制)表示为字符串。Go 作者已经认识到这一点,并已采取措施在未来将其从语言中删除和删除。在 Go 1.15 中,go vet已经对此类转换发出警告。Go 1.15 发行说明:Vet:

字符串(x)的新警告

vet 工具现在会针对除or以外的整数类型的表单string(x)的转换发出警告。Go 的经验表明,这种形式的许多转换错误地假设计算结果为整数 x 的字符串表示。它实际上计算为一个包含 UTF-8 编码的字符串。例如,不对字符串求值;它计算为字符串, 或.xrunebytestring(x)xstring(9786)"9786""\xe2\x98\xba""☺"

正确使用的代码string(x)可以重写为string(rune(x)). 或者,在某些情况下,utf8.EncodeRune(buf, x)使用合适的字节切片调用buf可能是正确的解决方案。其他代码最有可能使用strconv.Itoaor fmt.Sprint

使用go test.

我们正在考虑在 Go 的未来版本中禁止转换。也就是说,当类型为或时,语言将更改为仅允许string(x)整数。这种语言更改不会向后兼容。我们将此兽医检查用作更改语言的第一步。xxrunebyte

于 2020-08-17T09:43:58.767 回答