【问题标题】:Golang JSON MarshalingGolang JSON 编组
【发布时间】:2015-10-25 15:42:06
【问题描述】:

我正在尝试将数组编组为字符串,用换行符分隔所有元素。我内存不足,正在考虑一种更有效的方法。

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

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

问题:

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

【问题讨论】:

  • 以后你打算如何在你的应用中使用buffer
  • 您可以将缓冲区更改为字节切片并使用内置函数 append(...),但如果您尝试追加 GB 的数据,则无论如何都会出现内存不足的情况。跨度>
  • string 在 Golang 中是常量。最好使用bytes.Buffer 以及string 不变的其他语言。

标签: go


【解决方案1】:

假设您的数据本身对于运行它的计算机来说并不太大,那么问题很可能是该字符串的构建效率低下。相反,您应该使用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())

【讨论】:

  • 嘿,我正要发布这个,因为我刚刚将代码更改为使用 bytes.Buffer。谢谢!
【解决方案2】:

添加到 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

【讨论】:

  • 在for循环中,检查应该是err != nil
猜你喜欢
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2022-01-21
  • 1970-01-01
相关资源
最近更新 更多