使用golang 实现deflate、zlib压缩解压数据

使用golang 实现deflate、zlib压缩解压数据

在golang的官方标准库的compress目录下,有bzip2、flate、gzip、 lzw、 zlib包实现对应算法的数据压缩和解压,其中gzip包的一些使用上篇文章有写到,这篇文章给大家分享下deflate包、zlib包的使用

一、deflate压缩和解压数据

在deflate压缩的时候有个点需要注意一下,如果flate.Writer在没有被关闭的情况下,使用flate.Reader去读取缓冲区的内容,会报出一个io.ErrUnexpectedEOF的错误,但内容依旧可以被读取出来


//测试deflate
func TestCsFlate(t *testing.T)  {
	开始压缩
	//创建buffer
	buf := new(bytes.Buffer)
	//根据创建buffer生成flate Writer,可以选择压缩模式,这里选择默认
	flateWriter ,err := flate.NewWriter(buf,flate.DefaultCompression)
	if err != nil {
		t.Error(err.Error())
		return
	}
	flateWriter.Close()
	//使用flate Writer 向buffer写入压缩内容
	flateWriter.Write([]byte("hello,golang"))
	flateWriter.Flush()

	解压内容
	//根据刚才存有压缩内容的buffer获取flate Reader
	flateReader := flate.NewReader(buf)
	defer flateReader.Close()
	//copy flate Reader中的内容
	deBuffer := new(bytes.Buffer)
	_,err = io.Copy(deBuffer,flateReader)
	if err != nil {
		t.Error(err.Error())
		return
	}
	t.Log(deBuffer.String())

}

二、zlib格式压缩、解压

类似于deflate,zlib.Writer在没有关闭的情况下,去读取缓冲区内容是读取不到的,所以不能使用defer去关闭Writer,这个坑当时浪费了我一些时间。

package main

import (
	"bytes"
	"compress/zlib"
	"errors"
	"io"
	"io/ioutil"
	"testing"
)

func TestCsZlib(t *testing.T) {
	开始压缩
	//创建buffer
	buf := new(bytes.Buffer)
	//根据创建的buffer生成 zlib writer
	writer := zlib.NewWriter(buf)
	//写入数据
	_,err := writer.Write([]byte("hello, golang"))
	if err != nil {
		t.Error(err.Error())
		return
	}
	writer.Close()

	开始解压
	reader, err := zlib.NewReader(buf)
	if err != nil {
		t.Error(err.Error())
		return
	}
	defer reader.Close()
	content ,err := ioutil.ReadAll(reader)
	if err != nil &&  !errors.Is(err,io.ErrUnexpectedEOF){
		t.Error(err.Error())
		return
	}
	t.Log(string(content))
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
可以使用Oracle提供的go库 "github.com/godror/godror" 来实现。 以下是一个示例程序,用于向Oracle数据库中的表插入日期数据: ```go package main import ( "context" "database/sql" "fmt" "time" "github.com/godror/godror" ) func main() { // 创建一个Oracle数据库连接 dsn := godror.ConnectionParams{ Username: "username", Password: "password", SID: "sid", } db, err := sql.Open("godror", dsn.StringWithPassword()) if err != nil { panic(err) } defer db.Close() // 准备Insert语句 query := `INSERT INTO my_table (id, my_date) VALUES (:1, :2)` stmt, err := db.PrepareContext(context.Background(), query) if err != nil { panic(err) } defer stmt.Close() // 准备要插入的日期数据 myDate := time.Date(2021, 10, 1, 0, 0, 0, 0, time.UTC) // 执行Insert语句 result, err := stmt.ExecContext(context.Background(), 1, myDate) if err != nil { panic(err) } // 输出Insert结果 rowsAffected, err := result.RowsAffected() if err != nil { panic(err) } fmt.Printf("%d rows affected\n", rowsAffected) } ``` 在上面的示例程序中,我们使用 `time.Date` 函数创建了一个日期对象,然后将其作为参数插入到Insert语句中。在执行Insert语句时,我们使用了 `stmt.ExecContext` 函数,该函数的第二个参数是要插入的日期数据。 需要注意的是,Oracle数据库中的date类型数据golang中的time.Time类型数据具有不同的格式。在这种情况下,godror库会自动将golang的time.Time类型数据转换为Oracle的date类型数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值