Golang Go语言中io.Pipe使用示例
Golang Go语言中io.Pipe使用示例
真的很喜欢这个功能,小巧精悍。最近在一个项目中用到了,大概是这样的:
项目中有一个自定义的 http.RoundTripper,之前都是纯文本发送数据,现在想加上 gzip 压缩。
func (crt roundTripper) RoundTrip(r *http.Request) (*http.Response, error) {
if crt.compress {
r.Header.Add(headerContentEncoding, "gzip")
raw := r.Body
pr, pw := io.Pipe()
go func() {
defer pw.Close()
gw := gzip.NewWriter(pw)
defer gw.Close()
if n, err := io.Copy(gw, raw); err != nil {
crt.log.Logf("gzip body failed. written: %d, err: %v ", n, err)
}
}()
// set 0 enable Transfer-Encoding:chunked
r.ContentLength = 0
r.Body = pr
}
return crt.r.RoundTrip(r)
}
更多关于Golang Go语言中io.Pipe使用示例的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
2 回复
这里的 io.copy 倒是让我学到了
更多关于Golang Go语言中io.Pipe使用示例的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go语言中,io.Pipe
提供了一种在 goroutine 之间进行无缓冲或带缓冲的 I/O 操作的方法。它主要由三个部分组成:PipeReader
、PipeWriter
和一个同步机制,用于协调读写操作。以下是一个简单的 io.Pipe
使用示例:
package main
import (
"fmt"
"io"
"strings"
"sync"
)
func main() {
// 创建一个 io.Pipe
reader, writer := io.Pipe()
var wg sync.WaitGroup
wg.Add(2)
// 在一个 goroutine 中写入数据
go func() {
defer wg.Done()
defer writer.Close()
io.WriteString(writer, "Hello, io.Pipe!")
}()
// 在另一个 goroutine 中读取数据
go func() {
defer wg.Done()
buf := make([]byte, 1024)
n, err := reader.Read(buf)
if err != nil && err != io.EOF {
fmt.Println("Error reading:", err)
}
fmt.Println("Read:", string(buf[:n]))
}()
// 等待所有 goroutine 完成
wg.Wait()
}
在这个示例中,我们创建了一个 io.Pipe
,并在两个 goroutine 中分别进行写入和读取操作。写入操作完成后,我们关闭 writer
以通知读取端没有更多的数据。使用 sync.WaitGroup
来确保主 goroutine 等待所有操作完成后再退出。
io.Pipe
非常适合用于需要在不同 goroutine 之间传递数据流的场景,比如实现自定义的 I/O 代理、过滤器等。