Golang Go语言中io.Pipe使用示例

发布于 1周前 作者 sinazl 来自 Go语言

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 操作的方法。它主要由三个部分组成:PipeReaderPipeWriter 和一个同步机制,用于协调读写操作。以下是一个简单的 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 代理、过滤器等。

回到顶部