Go中Gzip與json搭配實現數據壓縮demo
更新時間:2023年05月25日 09:06:50 作者:goper
這篇文章主要為大家介紹了Go中Gzip與json搭配使用壓縮數據的實現demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
正文
在日常工作中,如果遇到數據量大的情況,在db中是不能直接存儲某些字段的,一般會用json進行marshal為 byte存入。但是如果此時占用空間依舊過大,則可以考慮再用gzip 還進一步壓縮。
demo
package main import ( "bytes" "compress/gzip" "encoding/json" ) func main() { } type anyStruct struct { } // 壓縮 與json搭配使用 func MarshalToJsonWithGzip(jsonData anyStruct) []byte { dataAfterMarshal, _ := json.Marshal(jsonData) dataAfterGzip, err := Encode(dataAfterMarshal) if err != nil { return nil } return dataAfterGzip } // 解壓 與json搭配使用 func UnmarshalDataFromJsonWithGzip(msg []byte) (*anyStruct, error) { dataAfterDecode, err := Decode(msg) if err != nil { return nil, err } data := &anyStruct{} err = json.Unmarshal(dataAfterDecode, data) if err != nil { return nil, err } return data, nil } // Gzip用法 壓縮數據 func Encode(input []byte) ([]byte, error) { // 創(chuàng)建一個新的 byte 輸出流 var buf bytes.Buffer // 創(chuàng)建一個新的 gzip 輸出流 gzipWriter := gzip.NewWriter(&buf) // 將 input byte 數組寫入到此輸出流中 _, err := gzipWriter.Write(input) if err != nil { _ = gzipWriter.Close() return nil, err } if err := gzipWriter.Close(); err != nil { return nil, err } // 返回壓縮后的 bytes 數組 return buf.Bytes(), nil } // Gzip用法 解壓數據 func Decode(input []byte) ([]byte, error) { // 創(chuàng)建一個新的 gzip.Reader bytesReader := bytes.NewReader(input) gzipReader, err := gzip.NewReader(bytesReader) if err != nil { return nil, err } defer func() { // defer 中關閉 gzipReader _ = gzipReader.Close() }() buf := new(bytes.Buffer) // 從 Reader 中讀取出數據 if _, err := buf.ReadFrom(gzipReader); err != nil { return nil, err } return buf.Bytes(), nil }
以上就是Go中Gzip與json搭配實現數據壓縮demo的詳細內容,更多關于Go 壓縮數據的資料請關注腳本之家其它相關文章!
相關文章
Golang語言如何讀取http.Request中body的內容
這篇文章主要介紹了Golang語言如何讀取http.Request中body的內容問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03