Golang通过Gzip压缩数据
简介为了将一个大的数据进行压缩,可以采用Gzip的方式进行处理,那么在Go语言中如何通过Gzip方式压缩数据呢,在使用过程中大家也会跟我一样会踩坑。本文主要记录下问题和最终的实现方式。
通过Golang将数据通过Gzip进行压缩踩坑记录。直接贴代码如下:
package main
import (
"bytes"
"compress/gzip"
"io/ioutil"
)
/*
* Gzip压缩处理
*/
func GzipEncode(in []byte) ([]byte, error) {
var (
buffer bytes.Buffer
out []byte
err error
)
writer := gzip.NewWriter(&buffer)
//使用压缩等级
//writer, _ := gzip.NewWriterLevel(&buffer, 5)
//最开始一直把关闭放在了defer里面,但是这样压缩后数据为空
//查阅相关资料才知道:gzip压缩的过程中,Write之后一定要及时Close,不能defer,这样才能flush,否则得不到任何数据
/*defer func() {
err := writer.Close()
if err != nil {
logrus.Info("Gzip压缩失败", err.Error())
}
}()*/
_, err = writer.Write(in)
if err != nil {
err = writer.Close()
return out, err
}
if err = writer.Close(); err != nil {
return out, err
}
return buffer.Bytes(), nil
}
/*
* Gzip解压处理
*/
func GzipDecode(in []byte) ([]byte, error) {
reader, err := gzip.NewReader(bytes.NewReader(in))
if err != nil {
var out []byte
return out, err
}
defer func() {
if err = reader.Close(); err != nil {
println("Gzip解压失败", err.Error())
}
}()
return ioutil.ReadAll(reader)
}
func main() {
a, _ := GzipEncode([]byte("测试GZIP压缩"))
println("---------------压缩后数据---------------")
println(string(a))
b, _ := GzipDecode(a)
println("---------------解压后数据---------------")
println(string(b))
}
代码注释中已经说的比较清楚了,最开始是通过defer来close的,但是这样一直返回空数据。gzip压缩的过程中,Write之后一定要及时Close,不能defer,这样才能flush,否则得不到任何数据。
前一篇博客中已经说过Golang对Gzip的处理,其实这是我的服务器端的处理,那么当我们服务器返回Gzip压缩的字符串后,客户端如何进行解压呢?本文主要记录下JavaScript对Gzip进行压缩和解压处理。
在Golang编程中,经常会用到MongoDB数据库进行查询,但是当日期是一个字符串的时候,如何根据日期进行分组查询呢?本文将记录如何分组查询统计。
图像的腐蚀与膨胀互为逆向操作,通常用于处理二值图像(黑白图,以黑色为底面背景),因此需要先进行二值化处理,腐蚀和膨胀通俗的理解就是,在指定大小的卷积核内,如果该卷积核内全为黑色或全为白色,则该卷积核内像素值不变,但若是既有黑色又有白色,即在图像边缘处,那么膨胀操作则会将该卷积核内所有白色像素点都赋值变为黑色,以此将图像向内腐蚀掉一圈,而膨胀操作则相反,会将卷积核内的黑色像素点赋值成2白色,以此让图像膨胀一圈。
如何通过查询语句来查询某个数据的排名,本文主要介绍MySql和MongoDB两种数据库的查询方式来进行排名。
对加密相关概念整理
快速生成表格
Electron页面跳转、浏览器打开链接和打开新窗口
在使用Git的过程中,不想每次都输入用户名和密码去拉取代码,所以就需要保存这些信息,那么既然有保存了,就必须有清除功能。
在Mac电脑中,如何对Git的用户名和密码进行修改呢?起初不懂Mac,所以整了很久,本文将记录如何对这个进行操作,以便后期使用。
Docker编译镜像出现:fetch http://dl-cdn.alpinelinux.org/alpine/v3.12/main/x86_64/APKINDEX.tar.gz
ERROR: http://dl-cdn.alpinelinux.org/alpine/v3.12/main: temporary error (try again later)
WARNING: Ignoring APKINDEX.2c4ac24e.tar.gz: No such file or directory问题