POST 之前的 gzip JSON 负载

Jim*_*y D 0 json gzip go

我有一个 JSON 类型的对象[]byte,是我使用json.Marshal. 我想先对 JSON 进行 GZip,然后再将其发布到我的端点。以下不起作用:

gz := gzip.NewWriter(myJSON)
Run Code Online (Sandbox Code Playgroud)

因为[]byte不落实io.Writer

一旦我创建了 JSON,是否有一些非常简单的方法可以做到这一点?

Fli*_*mzy 5

最好的选择是将 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)