go - 如何通过 channel 传递压缩字节?

标签 go channel

我正在尝试从缓冲读取器压缩文件并通过字节 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界面。然后通过 ChanWriterzlib.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/

相关文章:

go - channel 阻塞顺序

django - 简单的 django channel 应用程序未与 daphne 一起运行

string - 在golang中将子字符串转换为int

json - 一个具有多个 json 表示的结构

go - 如何将带有 nil 字段的结构插入 mongo?

go - 如何使用 channel 对 golang 管道阶段中的项目进行批处理?

asterisk - Asterisk 被叫 channel 挂断后继续调用 channel

java - Netty 3 中的channelOpen 和channelClosed 上游事件是否存在一对一的映射?

postgresql - gorm 不生成字符串列

go - append() 实现在哪里?