我正在尝试从缓冲读取器压缩文件并通过字节 channel 传递压缩字节,但结果很差:),这是我到现在为止的想法,显然这行不通...
func Compress(r io.Reader) (<-chan byte) {
c := make(chan byte)
go func(){
var wBuff bytes.Buffer
rBuff := make([]byte, 1024)
writer := zlib.NewWriter(*wBuff)
for {
n, err := r.Read(rBuff)
if err != nil && err != io.EOF { panic(err) }
if n == 0 { break }
writer.Write(rBuff) // Compress and write compressed data
// How to send written compressed bytes through channel?
// as fas as I understand wBuff will eventually contain
// whole compressed data?
}
writer.Close()
close(c) // Indicate that no more data follows
}()
return c
}
请耐心等待,因为我是 Go 的新手
最佳答案
我建议使用 []byte
而不是 byte
.它更有效率。由于并发内存访问,可能需要通过 channel 发送缓冲区的副本,而不是发送 []byte
。缓冲自身。
你可以定义一个type ChanWriter chan []byte
并让它执行 io.Writer
界面。然后通过 ChanWriter
至 zlib.NewWriter
.
您可以创建一个 goroutine 来进行压缩,然后立即返回 ChanWriter
来自您的 Compress
的 channel 功能。如果没有 goroutine,那么函数就没有理由返回一个 channel ,首选的返回类型是 io.Reader
。 .
Compress
的返回类型函数应更改为类似 chan <-BytesWithError
的内容.在这种情况下 ChanWriter
可以定义为 type ChanWriter chan BytesWithError
.
关于go - 如何通过 channel 传递压缩字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16660446/