【问题标题】:Why string cannot convert to other data type array except uint8 and int32?为什么字符串不能转换为除 uint8 和 int32 之外的其他数据类型数组?
【发布时间】: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


    【解决方案1】:

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

    非常量值的允许转换:Spec: Conversions:

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

    • xassignableT
    • 忽略结构标签(见下文),x 的类型和Tidentical 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. 将字符串类型的值转换为 runes 类型的切片会生成包含字符串的各个 Unicode 代码点的切片。

    string 转换为[]byte 是“有用的”,因为这是文本的UTF-8 编码字节序列,这正是Go 在内存中存储字符串的方式,这通常是您应该存储的数据/传输以便通过字节流(例如io.Writer)传递string,同样,这也是您可以从io.Reader 中得到的。

    string 转换为[]rune 也很有用,它会生成文本的字符(符文),因此您可以轻松地检查/操作string 的字符(这在实际中经常需要) -生活应用)。

    string 转换为[]int8 并不是很有用,因为字节流在bytes 上运行(这是uint8 的别名,而不是int8)。如果在特定情况下您需要来自string[]int8,您可以编写自定义转换器(这很可能会将字符串的各个字节转换为int8 值)。

    【讨论】:

      【解决方案2】:

      来自 go 文档:

      string 是所有 8 位字节字符串的集合,通常但不是 必须代表 UTF-8 编码的文本。字符串可能为空,但 不是零。字符串类型的值是不可变的。

      所以一个字符串和 []uint8 一样

      这就是为什么您可以将其转换为 rune 和 uint8

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        • 2015-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多