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

在 Go 中整数到字符串的转换是如何工作的?

在 Go 中整数到字符串的转换是如何工作的?

Go
catspeake 2021-12-07 10:33:42
我今天才开始围棋,所以这可能很明显,但我找不到任何关于它的东西。是什么var x uint64 = 0x12345678; y := string(x)给予y?我知道var x uint8 = 65; y := string(x)会给出y字节 65,字符A和常识会建议(因为类型大于uint8允许转换为字符串的类型),它们将简单地打包到本机字节顺序(即小端)并分配给变量。情况似乎并非如此:hex.EncodeToString([]byte(y)) ==> "efbfbd"第一个想法说这是一个地址,由于一些奇怪的空终止符,最后一个字节被遗漏了,但是如果我分配两个x和y变量具有两个不同的值并将它们打印出来,我会得到相同的结果。var x, x2 uint64 = 0x10000000, 0x20000000y, y2 := string(x), string(x2)fmt.Println(hex.EncodeToString([]byte(y))) // "efbfbd"fmt.Println(hex.EncodeToString([]byte(y2))) // "efbfbd"令人抓狂的是,我在任何地方都找不到 string 类型的实现,尽管我可能看起来还不够努力。
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

这在Spec: Conversions: Conversions to and from a string type 中有介绍:

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

如此有效地将数值转换为 时string,它只能产生string一个rune(字符)。由于 Gostrings在内存中存储为 UTF-8 编码的字节序列,如果您将其转换string[]byte

将字符串类型的值转换为字节类型的切片会产生一个切片,其连续元素是字符串的字节。

当您尝试将0x12345678,0x100000000x20000000值转换为 时string,由于它们超出了有效 Unicode 代码点的范围,因此根据规范,它们将转换为"\uFFFD"UTF-8 编码中的[]byte{239, 191, 189}; 当编码为十六进制字符串时:

fmt.Println(hex.EncodeToString([]byte("\uFFFD"))) // Output: efbfbd

或者干脆:

fmt.Printf("%x", "\uFFFD") // Output: efbfbd

阅读博客文章Go 中的字符串、字节、符文和字符,了解有关string内部结构的更多详细信息。

顺便说一句,从 Go 1.5 开始,Go 运行时(大部分)是在 Go 中实现的,所以这些转换现在是在 Go 中实现的,可以在runtime包中找到:runtime/string.go,查找intstring()函数。


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 185 浏览
慕课专栏
更多

添加回答

举报

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