Golang JSON Marshaling

时间:2015-08-03 13:39:34

标签: go

我正在尝试将数组编组成一个字符串,用换行符分隔所有元素。我的内存耗尽,想一个更有效的方法。

buffer := ""
for _, record := range all_data {

    body, _ := json.Marshal(record)
    buffer += string(body) + "\n" // i run out of memory here

问题:

有没有办法将换行符附加到字节数组?现在我正在通过string(body)进行投射,但我认为这个操作分配了大量内存(但也许我错了)。

2 个答案:

答案 0 :(得分:3)

假设您的数据对于正在运行的计算机而言本身并不太大,问题可能是该字符串的低效构建。相反,您应该使用bytes.buffer,然后调用它是String()方法。这是一个例子;

var buffer bytes.Buffer

for _, record := range all_data {
    body, _ := json.Marshal(record)
    buffer.Write(body)
    buffer.WriteString("\n")
}

fmt.Println(buffer.String())

答案 1 :(得分:0)

要添加到evanmcdonnal的答案:您甚至不需要json.Marshal创建的中间缓冲区:

var buf bytes.Buffer
enc := json.NewEncoder(&buf)
for _, record := range allData {
  if err := enc.Encode(record); enc != nil {
    // handle error
  }
  buf.WriteString("\n") // optional
}
fmt.Println(buf.String())

https://play.golang.org/p/5K9Oj0Xbjaa