将 [][]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 正确指出的那样,在我们知道您如何衡量性能之前,很难合理地猜测。