【问题标题】:Does Golang do any conversion when casting a byte slice to a string?Golang 在将字节切片转换为字符串时是否进行任何转换?
【发布时间】:2014-01-25 22:57:21
【问题描述】:

在将字节切片转换为字符串时,Golang 是否进行任何转换或以某种方式尝试解释字节?我刚刚尝试了一个包含空字节的字节切片,它看起来仍然保持字符串原样。

var test []byte
test = append(test, 'a')
test = append(test, 'b')
test = append(test, 0)
test = append(test, 'd')
fmt.Println(test[2] == 0) // OK

但是,带有无效 unicode 点或 UTF-8 编码的字符串呢?会不会投射失败或数据损坏?

【问题讨论】:

  • 正如回答者所说,Go 不会转换任何东西。 (Rob Pike explaining Go strings 可能会或可能不会为您阐明这个问题,但阅读它只会是一件好事。)string[]byte 转换 do 复制原始字节,但是,因为strings 是不可变的,而[]bytes 不是。因此,例如,取出不需要的转换可以减少垃圾。

标签: string casting go byte slice


【解决方案1】:

The Go Programming Language Specification

String types

字符串类型表示字符串值的集合。字符串值是 (可能为空)字节序列。

Conversions

字符串类型的转换

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

string([]byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'})   // "hellø"
string([]byte{})                                     // ""
string([]byte(nil))                                  // ""

type MyBytes []byte
string(MyBytes{'h', 'e', 'l', 'l', '\xc3', '\xb8'})  // "hellø"

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

[]byte("hellø")   // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}
[]byte("")        // []byte{}

MyBytes("hellø")  // []byte{'h', 'e', 'l', 'l', '\xc3', '\xb8'}

字符串值是一个(可能为空的)字节序列。字符串值可能表示也可能不表示以 UTF-8 编码的 Unicode 字符。在从byte 切片到string 或从stringbyte 切片的转换过程中,没有字节解释。因此,字节不会改变,转换也不会失败。

【讨论】:

    【解决方案2】:

    不,施法不能失败。下面是一个示例(在 Go Playground 中运行):

    b := []byte{0x80}
    s := string(b)
    fmt.Println(s)
    fmt.Println([]byte(s))
    for _, c := range s {
        fmt.Println(c)
    }
    

    打印出来:

    �
    [128]
    65533
    

    请注意,根据Go spec,对无效 UTF-8 的范围进行了很好的定义:

    对于字符串值,“range”子句遍历 Unicode 代码 从字节索引 0 开始的字符串中的点。在连续 迭代,索引值将是第一个字节的索引 字符串中连续的 UTF-8 编码代码点,第二个 符文类型的值将是相应代码的值 观点。如果迭代遇到无效的 UTF-8 序列,则 第二个值将是 0xFFFD,Unicode 替换字符,并且 下一次迭代将在字符串中前进一个字节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-02
      • 2018-09-15
      • 2016-06-28
      • 1970-01-01
      • 2021-10-29
      • 2014-02-27
      • 2019-10-10
      • 1970-01-01
      相关资源
      最近更新 更多