我试图将2D字符串切片转换为1d字节切片,但它非常慢。有没有更好的方法可以做到?func TwoDstringsliceToOneByteSlice(csvRecords [][]string) []byte { var singleSlice []byte for _, record := range csvRecords { for _, item := range record { singleSlice = append(singleSlice, []byte(item)...) } } return singleSlice}
1 回答
MM们
TA贡献1886条经验 获得超2个赞
示例中的每个参数首先复制其参数 — a 和 a 之间的类型转换(反之亦然)是 Go 中为数不多的复制数据的位置之一 — 然后很可能复制目标切片,以便为要追加的内容在其中创建更多空间。appendstring[]byte
改善这一点的一个明显方法是这样的
func TwoDstringsliceToOneByteSlice(csvRecords [][]string) []byte {
var buf bytes.Buffer
for _, record := range csvRecords {
for _, item := range record {
buf.WriteString(item)
}
}
return buf.Bytes()
}
请注意,如果您打算将结果用于“读取” - 例如使用此类数据作为HTTP POST请求的有效负载的情况,则可以立即使用 - 而无需从中获取字节切片 - 作为实现。bytes.Bufferbytes.Bufferio.Reader
第二个优化是首先计算所有字符串的总长度,然后预先分配目标切片。
然后,您可以在写信之前调用它,或者放弃并使用子切片和(但我建议不要这样做 - 到现在为止)。.Grow()bytes.Bufferbytes.Buffercopy
...但是,正如@JimB正确指出的那样,我们知道您如何衡量性能,因此很难合理地猜测。
- 1 回答
- 0 关注
- 79 浏览
添加回答
举报
0/150
提交
取消