将 [][]string 转换为 []byte
Convert a [][]string into []byte
我正在尝试将二维字符串切片转换为一维字节切片,但速度非常慢。有更好的方法吗?,
func TwoDstringsliceToOneByteSlice(csvRecords [][]string) []byte {
var singleSlice []byte
for _, record := range csvRecords {
for _, item := range record {
singleSlice = append(singleSlice, []byte(item)...)
}
}
return singleSlice
}
示例中的每个 append
首先复制其参数 — string
和 []byte
之间的类型转换(反之亦然)是 Go 中为数不多的地方之一复制数据,- 然后很可能复制目标切片以在其中为附加的内容创造更多空间。
一个明显的改进方法是
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.Buffer
立即 - 无需从中获取字节片 - 因为 bytes.Buffer
实现 io.Reader
.
第二个改进是先计算所有字符串的总长度,然后预分配目标切片。
然后,您可以在写入 bytes.Buffer
之前调用 .Grow()
,或者放弃 bytes.Buffer
并使用子切片和 copy
(但我现在建议不要这样做)。
…但是,正如@JimB 正确指出的那样,在我们知道您如何衡量性能之前,很难合理地猜测。
我正在尝试将二维字符串切片转换为一维字节切片,但速度非常慢。有更好的方法吗?,
func TwoDstringsliceToOneByteSlice(csvRecords [][]string) []byte {
var singleSlice []byte
for _, record := range csvRecords {
for _, item := range record {
singleSlice = append(singleSlice, []byte(item)...)
}
}
return singleSlice
}
示例中的每个 append
首先复制其参数 — string
和 []byte
之间的类型转换(反之亦然)是 Go 中为数不多的地方之一复制数据,- 然后很可能复制目标切片以在其中为附加的内容创造更多空间。
一个明显的改进方法是
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.Buffer
立即 - 无需从中获取字节片 - 因为 bytes.Buffer
实现 io.Reader
.
第二个改进是先计算所有字符串的总长度,然后预分配目标切片。
然后,您可以在写入 bytes.Buffer
之前调用 .Grow()
,或者放弃 bytes.Buffer
并使用子切片和 copy
(但我现在建议不要这样做)。
…但是,正如@JimB 正确指出的那样,在我们知道您如何衡量性能之前,很难合理地猜测。