【问题标题】:How do int-to-string casts work in Go?在 Go 中,int 到字符串的转换如何工作?
【发布时间】:2016-01-15 09:56:41
【问题描述】:

我今天才开始使用 Go,所以这可能很明显,但我在上面找不到任何东西。

var x uint64 = 0x12345678; y := string(x)y 带来了什么?

我知道var x uint8 = 65; y := string(x) 会给y 字节65,字符A,并且常识会建议(因为允许将大于uint8 的类型转换为字符串)它们将被简单地打包到本地字节顺序(即小端)并分配给变量。

好像不是这样的:

hex.EncodeToString([]byte(y)) ==> "efbfbd"

首先想到的是,这是一个最后一个字节被遗漏的地址,因为一些奇怪的空终止符,但是如果我分配两个具有两个不同值的 xy 变量并将它们打印出来,我会得到相同的结果结果。

var x, x2 uint64 = 0x10000000, 0x20000000
y, y2 := string(x), string(x2)
fmt.Println(hex.EncodeToString([]byte(y))) // "efbfbd"
fmt.Println(hex.EncodeToString([]byte(y2))) // "efbfbd"

令人发指的是,我在任何地方都找不到字符串类型的实现,尽管我可能还不够努力。

【问题讨论】:

    标签: string go type-conversion


    【解决方案1】:

    Spec: Conversions: Conversions to and from a string type: 对此进行了介绍

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

    当你将一个数值转换为string 时,它只能产生一个string 有一个rune(字符)。由于 Go 将 strings 存储为内存中的 UTF-8 编码字节序列,因此如果将 string 转换为 []byte,您将看到:

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

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

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

    或者简单地说:

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

    阅读博文Strings, bytes, runes and characters in Go,了解有关string 内部结构的更多详细信息。

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

    【讨论】:

      猜你喜欢
      • 2012-04-23
      • 1970-01-01
      • 2018-03-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 2021-03-11
      • 2018-11-07
      相关资源
      最近更新 更多