当我尝试将string
转换为[]int
时,编译失败。我发现字符串可以转换to int32(rune)
和uint8(byte)
。
这是我的测试代码:
s1 := "abcd"
b1 := []byte(s1)
r1 := []rune(s1)
i1 := []int8(s1) //error
答案 0 :(得分:3)
简短的回答是因为语言规范不允许这样做。
允许的非恒定值转换: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"
。将一个字节的切片转换为字符串类型会产生一个字符串,其连续字节是该切片的元素。
将一小段符文转换为字符串类型会产生一个字符串,该字符串是转换为字符串的各个符文值的串联。
将字符串类型的值转换为字节类型的切片会产生一个切片,其连续元素是字符串的字节。
将字符串类型的值转换为符文类型的切片会产生一个切片,其中包含字符串的各个Unicode代码点。
将string
转换为[]byte
是“有用的”,因为这是文本的UTF-8编码字节序列,这正是Go将字符串存储在内存中的方式,通常是数据您应该存储/传输以便通过字节流(例如io.Writer
)传递string
,并且类似地,您可以从io.Reader
中受益。
将string
转换为[]rune
也是有用的,它会导致文本的字符(符文),因此您可以轻松检查/操作string
的字符(在现实生活中经常需要使用。)
鉴于字节流在string
上运行(这是[]int8
而不是{{1的别名),因此将byte
转换为uint8
并没有太大用处。 }})。如果在特定情况下需要int8
中的[]int8
,则可以编写自定义转换器(这很可能会将字符串的各个字节转换为string
值)。>
答案 1 :(得分:1)
转到文档中:
string是所有8位字节的字符串的集合,按常规,但不是 必须代表UTF-8编码的文本。字符串可能为空,但是 不为零。字符串类型的值是不可变的。
因此字符串与[] uint8
相同这就是为什么您可以将其转换为符文和uint8
的原因