我有一个 JSON 类型的对象[]byte,是我使用json.Marshal. 我想先对 JSON 进行 GZip,然后再将其发布到我的端点。以下不起作用:
gz := gzip.NewWriter(myJSON)
Run Code Online (Sandbox Code Playgroud)
因为[]byte不落实io.Writer。
一旦我创建了 JSON,是否有一些非常简单的方法可以做到这一点?
最好的选择是将 JSON 编组流式传输到 gzip 编写器:
func compressJSON(w io.Writer, i interface{}) error {
gz := gzip.NewWriter(w)
if err := json.NewEncoder(gz).Encode(i); err != nil {
return err
}
return gz.Close()
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是不会暂时在内存中缓冲 json,因此速度会更快并且使用更少的 RAM。
如果您需要将其作为io.Reader,例如 HTTP 请求的正文,则可以使用管道进行转换:
r, w := io.Pipe()
go func() {
err := compressJSON(w, someObject)
w.CloseWithError(err)
}()
req, err := http.NewRequest("POST", "http://example.com/", r)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5213 次 |
| 最近记录: |