如何在Go中使用int-to-string强制转换?

时间:2016-01-15 09:56:42

标签: string go type-conversion

我今天才开始去,所以这可能很明显,但我找不到任何东西。

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"

疯狂地我无法在任何地方找到字符串类型的实现,尽管我可能看起来还不够。

1 个答案:

答案 0 :(得分:5)

Spec: Conversions: Conversions to and from a string type:

中介绍了这一点
  

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

将数值转换为string时非常有效,它只能产生stringrune(字符)。由于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,查找{ {1}}功能。