如何将[] int8转换为字符串
从[]int8
字符串转换为字符串的最佳方法(最快的性能)是什么?
对于[]byte
我们可以做string(byteslice)
,但[]int8
它给出了一个错误:
cannot convert ba (type []int8) to type string
我ba
从那产生的from
SliceScan()
方法而不是*sqlx.Rows
[]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)
直接做。
回答:
询问者首先指出输入分片就是[]int8
答案。后来他意识到输入是[]uint8
可以直接转换为的,string
因为byte
它是别名uint8
(并且语言规范支持[]byte
=>
string
转换)。
您无法转换不同类型的切片,必须手动进行。
问题是我们应该转换为哪种类型的切片?我们有2个候选人:[]byte
和[]rune
。字符串在内部([]byte
)作为UTF-8编码的字节序列存储,string
也可以将a转换为一段符文。该语言支持将这两种类型([]byte
和[]rune
)都转换为string
。
A rune
是一个Unicode代码点。如果我们尝试以一对一的方式将a 转换int8
为a
rune
,那么如果输入包含编码为多个字节(使用UTF-8)的字符,则它将失败(表示错误的输出),因为在这种情况下,int8
应使用多个值最终合而为一rune
。
让我们从"世界"
字节为以下的字符串开始:
fmt.Println([]byte("世界"))// Output: [228 184 150 231 149 140]
及其符文:
fmt.Println([]rune("世界"))// [19990 30028]
它只有2个符文和6个字节。因此,显然1对1- int8
> rune
映射将不起作用,我们必须使用1-1- int8
> byte
映射。
byte
是uint8
具有range的别名,如果字节值> 127 0..255
,则必须将其转换为[]int8
(具有range
-128..127
),-256+bytevalue
因此"世界"
string
in []int8
如下所示:
[-28 -72 -106 -25 -107 -116]
向后转换我们想要的是:bytevalue = 256 + int8value
如果a int8
为负,但我们不能将其转换为int8
(range
-128..127),也不byte
能将其转换为(range 0..255),因此我们还必须将其转换为int
first(and
back)到byte
最后)。可能看起来像这样:
if v < 0 { b[i] = byte(256 + int(v))
} else {
b[i] = byte(v)
}
由于我们知道切片的长度,因此分配具有该长度的切片并仅使用索引设置其元素[]
而不调用内置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上尝试一下。
以上是 如何将[] int8转换为字符串 的全部内容, 来源链接: utcz.com/qa/398939.html