github.com/JohanShen/go-utils@v1.1.4-0.20201117124024-901319a2b2a0/utils/zip.go (about) 1 package utils 2 3 import ( 4 "bytes" 5 "compress/gzip" 6 "compress/zlib" 7 "fmt" 8 "io" 9 ) 10 11 type Closer interface { 12 Close() error 13 } 14 15 func ioClose(obj Closer) { 16 if obj != nil { 17 if err := obj.Close(); err != nil { 18 fmt.Println(err) 19 } 20 } 21 } 22 23 //zip压缩 24 func ZipBytes(data []byte) ([]byte, error) { 25 26 var in bytes.Buffer 27 //z:=zlib.NewWriter(&in) 28 z, err := zlib.NewWriterLevel(&in, zlib.DefaultCompression) 29 if err != nil { 30 return []byte{}, err 31 } 32 _, err = z.Write(data) 33 if err != nil { 34 return []byte{}, err 35 } 36 ioClose(z) 37 return in.Bytes(), nil 38 } 39 40 //zip解压 41 func UZipBytes(data []byte) ([]byte, error) { 42 var out bytes.Buffer 43 var in bytes.Buffer 44 in.Write(data) 45 r, err := zlib.NewReader(&in) 46 if err != nil { 47 return []byte{}, err 48 } 49 50 _, err = io.Copy(&out, r) 51 if err != nil { 52 return []byte{}, err 53 } 54 ioClose(r) 55 return out.Bytes(), nil 56 } 57 58 //压缩 59 func GZipBytes(data []byte) ([]byte, error) { 60 var input bytes.Buffer 61 //g := gzip.NewWriter(&input) 62 g, err := gzip.NewWriterLevel(&input, gzip.DefaultCompression) 63 if err != nil { 64 return []byte{}, err 65 } 66 _, err = g.Write(data) 67 if err != nil { 68 return []byte{}, err 69 } 70 ioClose(g) 71 return input.Bytes(), nil 72 } 73 74 //解压 75 func UGZipBytes(data []byte) ([]byte, error) { 76 var out bytes.Buffer 77 var in bytes.Buffer 78 in.Write(data) 79 r, err := gzip.NewReader(&in) 80 if err != nil { 81 return []byte{}, err 82 } 83 _, err = io.Copy(&out, r) 84 if err != nil { 85 return []byte{}, err 86 } 87 ioClose(r) 88 return out.Bytes(), nil 89 }