为什么字符串不能转换为除uint8和int32之外的其他数据类型数组?

时间:2019-04-25 09:02:09

标签: string go type-conversion slice

当我尝试将string转换为[]int时,编译失败。我发现字符串可以转换to int32(rune)uint8(byte)。 这是我的测试代码:

s1 := "abcd"
b1 := []byte(s1)
r1 := []rune(s1)
i1 := []int8(s1) //error

2 个答案:

答案 0 :(得分:3)

简短的回答是因为语言规范不允许这样做。

允许的非恒定值转换:Spec: Conversions:

  

在以下任何一种情况下,非恒定值x都可以转换为类型T

     
      
  • xassignableT
  •   
  • 忽略结构标记(见下文),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:

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

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

  4.   
  5. 将一小段符文转换为字符串类型会产生一个字符串,该字符串是转换为字符串的各个符文值的串联。

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

  8.   
  9. 将字符串类型的值转换为符文类型的切片会产生一个切片,其中包含字符串的各个Unicode代码点。

  10.   

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

的原因