Лучшим вариантом является потоковая передача маршалинга 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()
}
Преимущество этого заключается в том, что вы временно не буферизуете свой json в памяти, поэтому он будет быстрее и будет использовать меньше оперативной памяти.
Если вам нужно это как 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)