Go中的透明(类似过滤器)gzip/gunzip

sir*_*nga 4 go

我正在努力将gzip Writer直接连接到gzip Reader,这样我就可以写入Writer并随时从Reader中读取.我期待读完我写的内容.我正在使用gzip,但是我也想使用这种方法和crypto/aes,我想它应该非常相似,它可以和其他读者/作者一起使用,比如jpeg,png ......

这是我最好的选择,这是行不通的,但我希望你能看出我的意思:http://play.golang.org/p/7qdUi9wwG7

package main

import (
    "bytes"
    "compress/gzip"
    "fmt"
)

func main() {
    s := []byte("Hello world!")
    fmt.Printf("%s\n", s)

    var b bytes.Buffer

    gz := gzip.NewWriter(&b)
    ungz, err := gzip.NewReader(&b)
    fmt.Println("err: ", err)

    gz.Write(s)
    gz.Flush()
    uncomp := make([]byte, 100)
    n, err2 := ungz.Read(uncomp)
    fmt.Println("err2: ", err2)
    fmt.Println("n: ", n)
    uncomp = uncomp[:n]
    fmt.Printf("%s\n", uncomp)
}
Run Code Online (Sandbox Code Playgroud)

似乎gzip.NewReader(&b)是试图立即阅读并返回EOF.

Nic*_*ood 5

你需要做两件事才能让它发挥作用

  1. 使用io.Pipe将读写器连接在一起 - 您无法从同一缓冲区读取和写入
  2. 在单独的goroutines中运行读写.因为gzip做的第一件事就是尝试读取头文件,否则你会遇到死锁,除非你有另一个例行程序来编写它.

这是看起来像

操场

func main() {
    s := []byte("Hello world!")
    fmt.Printf("%s\n", s)

    in, out := io.Pipe()

    gz := gzip.NewWriter(out)
    go func() {
        ungz, err := gzip.NewReader(in)
        fmt.Println("err: ", err)
        uncomp := make([]byte, 100)
        n, err2 := ungz.Read(uncomp)
        fmt.Println("err2: ", err2)
        fmt.Println("n: ", n)
        uncomp = uncomp[:n]
        fmt.Printf("%s\n", uncomp)
    }()
    gz.Write(s)
    gz.Flush()    
}
Run Code Online (Sandbox Code Playgroud)