【发布时间】:2019-09-14 15:57:52
【问题描述】:
当我尝试将string 转换为[]int 时,编译失败。我发现字符串可以转换to int32(rune) 和uint8(byte)。
这是我的测试代码:
s1 := "abcd"
b1 := []byte(s1)
r1 := []rune(s1)
i1 := []int8(s1) //error
【问题讨论】:
标签: string go type-conversion slice
当我尝试将string 转换为[]int 时,编译失败。我发现字符串可以转换to int32(rune) 和uint8(byte)。
这是我的测试代码:
s1 := "abcd"
b1 := []byte(s1)
r1 := []rune(s1)
i1 := []int8(s1) //error
【问题讨论】:
标签: string go type-conversion slice
简短的回答是因为语言规范不允许这样做。
非常量值的允许转换:Spec: Conversions:
在以下任何一种情况下,非常量值
x都可以转换为类型T:
x是 assignable 到T。- 忽略结构标签(见下文),
x的类型和T有identical underlying types。- 忽略结构标记(见下文),
x的类型和T是不是defined types 的指针类型,它们的指针基类型具有相同的底层类型。x的类型和T都是整数或浮点类型。x的类型和T都是复杂类型。x是整数或字节切片或符文,T是字符串类型。x是一个字符串,T是一个字节或符文片段。
更长的答案是:
Spec: Conversions: Conversions to and from a string type:
将有符号或无符号整数值转换为字符串类型会生成一个包含整数的 UTF-8 表示形式的字符串。超出有效 Unicode 代码点范围的值将转换为
"\uFFFD"。将字节切片转换为字符串类型会产生一个字符串,其连续字节是切片的元素。
将一片符文转换为字符串类型会生成一个字符串,该字符串是转换为字符串的各个符文值的串联。
将字符串类型的值转换为字节类型的切片会产生一个切片,其连续元素是字符串的字节。
将字符串类型的值转换为 runes 类型的切片会生成包含字符串的各个 Unicode 代码点的切片。
将string 转换为[]byte 是“有用的”,因为这是文本的UTF-8 编码字节序列,这正是Go 在内存中存储字符串的方式,这通常是您应该存储的数据/传输以便通过字节流(例如io.Writer)传递string,同样,这也是您可以从io.Reader 中得到的。
将string 转换为[]rune 也很有用,它会生成文本的字符(符文),因此您可以轻松地检查/操作string 的字符(这在实际中经常需要) -生活应用)。
将string 转换为[]int8 并不是很有用,因为字节流在bytes 上运行(这是uint8 的别名,而不是int8)。如果在特定情况下您需要来自string 的[]int8,您可以编写自定义转换器(这很可能会将字符串的各个字节转换为int8 值)。
【讨论】:
来自 go 文档:
string 是所有 8 位字节字符串的集合,通常但不是 必须代表 UTF-8 编码的文本。字符串可能为空,但 不是零。字符串类型的值是不可变的。
所以一个字符串和 []uint8 一样
这就是为什么您可以将其转换为 rune 和 uint8
【讨论】: