int-to-string转换在Go中如何工作?

int-to-string转换在Go中如何工作?,string,go,type-conversion,String,Go,Type Conversion,我今天才开始走,所以这可能很明显,但我在上面找不到任何东西 什么是var x uint64=0x12345678;y:=字符串(x)givey 我知道var x uint8=65;y:=string(x)将给出y字节65,字符A,常识将建议(因为大于uint8的类型可以强制转换为字符串),它们将简单地按照本机字节顺序打包(即小尾端)并分配给变量 情况似乎并非如此: hex.EncodeToString([]byte(y)) ==> "efbfbd" 第一个想法是,这是一个地址,由于一些奇

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

什么是
var x uint64=0x12345678;y:=字符串(x)
give
y

我知道
var x uint8=65;y:=string(x)
将给出
y
字节65,字符
A
,常识将建议(因为大于
uint8
的类型可以强制转换为字符串),它们将简单地按照本机字节顺序打包(即小尾端)并分配给变量

情况似乎并非如此:

hex.EncodeToString([]byte(y)) ==> "efbfbd"
第一个想法是,这是一个地址,由于一些奇怪的空终止符,最后一个字节被省略了,但是如果我分配两个
x
y
变量,使用两个不同的值并打印出来,我会得到相同的结果

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"
令人发狂的是,我在任何地方都找不到字符串类型的实现,尽管我可能还没有仔细研究过

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

因此,当您将数值转换为
字符串
时,它只能生成一个
字符串
,其中包含一个
符文
(字符)。由于Go将
字符串作为UTF-8编码的字节序列存储在内存中,因此如果将
字符串
转换为
[]字节
,您将看到:

将字符串类型的值转换为字节类型的切片将生成一个切片,其后续元素是字符串的字节

当您尝试将
0x12345678
0x10000000
0x20000000
值转换为
string
,因为它们不在有效Unicode代码点的范围内,根据规范,它们被转换为
“\uFFFD”
,在UTF-8编码中是
[]字节{2391189}
;编码为十六进制字符串时:

fmt.Println(hex.EncodeToString([]byte("\uFFFD"))) // Output: efbfbd
或者简单地说:

fmt.Printf("%x", "\uFFFD") // Output: efbfbd
有关
string
internal的更多详细信息,请阅读博客文章

顺便说一句,由于Go 1.5的Go运行时(大部分)是在Go中实现的,因此这些转换现在在Go中实现,可以在包中找到:,查找
intstring()
函数