gpt4 book ai didi

string - 如何将 []int8 转换为字符串

转载 作者:IT王子 更新时间:2023-10-29 01:22:18 25 4
gpt4 key购买 nike

[]int8 转换为字符串的最佳方式(性能最快)是什么?

对于 []byte 我们可以做 string(byteslice),但是对于 []int8 它给出了一个错误:

cannot convert ba (type []int8) to type string

我从 *sqlx.RowsSliceScan() 方法中得到了 ba生成 []int8 而不是 string

这个解决方案是最快的吗?

func B2S(bs []int8) string {
ba := []byte{}
for _, b := range bs {
ba = append(ba, byte(b))
}
return string(ba)
}

编辑 我的错,它是 uint8 而不是 int8.. 所以我可以做 string(ba)直接。

最佳答案

事先注意:提问者首先声明输入 slice 是[]int8这就是答案的目的。后来他意识到输入是[]uint8可以直接转换为string因为byteuint8 的别名(并且 []byte => string 转换由 language spec 支持)。


您不能转换不同类型的 slice ,您必须手动进行。

问题是我们应该转换成什么类型​​的 slice ?我们有 2 个候选人:[]byte[]rune .字符串在内部存储为 UTF-8 编码字节序列 ( []byte ),和一个 string也可以转化为一片 rune 。该语言支持将这两种类型( []byte[]rune )转换为 string .

A rune是一个unicode代码点。如果我们尝试转换 int8rune以一对一的方式,如果输入包含编码为多个字节(使用 UTF-8)的字符,它将失败(意味着错误的输出),因为在这种情况下多个 int8值应该以一个 rune 结尾.

让我们从字符串 "世界" 开始其字节是:

fmt.Println([]byte("世界"))
// Output: [228 184 150 231 149 140]

及其 rune :

fmt.Println([]rune("世界"))
// [19990 30028]

只有2个 rune 和6个字节。显然是一对一 int8 -> rune映射不起作用,我们必须使用 1-1 int8 -> byte映射。

byteuint8 的别名范围 0..255 , 将其转换为 []int8 (范围为 -128..127 )我们必须使用 -256+bytevalue如果字节值 > 127 那么 "世界" string[]int8看起来像这样:

[-28 -72 -106 -25 -107 -116]

我们想要的反向转换是:bytevalue = 256 + int8value如果int8是负的,但我们不能这样做 int8 (范围 -128..127)并且都不是 byte (范围 0..255)所以我们还必须将其转换为 int首先(最后回到 byte)。这可能看起来像这样:

if v < 0 {
b[i] = byte(256 + int(v))
} else {
b[i] = byte(v)
}

但实际上因为有符号整数是使用 2's complement 表示的,如果我们简单地使用 byte(v),我们会得到相同的结果转换(在负数的情况下,这相当于 256 + v )。

注意:因为我们知道 slice 的长度,所以分配具有该长度的 slice 并使用索引 [] 设置其元素要快得多而不是调用内置的 append功能。

所以这是最终的转换:

func B2S(bs []int8) string {
b := make([]byte, len(bs))
for i, v := range bs {
b[i] = byte(v)
}
return string(b)
}

Go Playground 上试试.

关于string - 如何将 []int8 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28848187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com