go - 如何 "bridge"writer 和 reader in go

标签 go

我通常在 Golang 中使用 Reader 和 Writer 找到自己的方式,但我遇到了一个对我来说很陌生的情况。

我正在使用“golang.org/x/net/html”渲染。它输出到 Writer w。我想使用该输出并从中创建一个新请求。 NewRequest 使用一个 Reader r。

err := html.Render(w, msg)
...
req, err := http.NewRequest("Post", url, r)
io.Copy(w, r)

我的问题是“使用 w 和 r 绑定(bind)两个调用的最佳/理想解决方案是什么?”。我在网上找不到类似情况的示例。我正在考虑创建 Reader 和 Writer 并对它们使用 io.Copy(w, r) 。我不确定,因为对于显然经常使用的东西来说,这看起来有点复杂。

最佳答案

一个简单的方法是使用 bytes.Buffer :

var buf bytes.Buffer
err := html.Render(&buf, msg)
...
req, err := http.NewRequest("POST", url, &buf)

这会在内存中缓冲整个请求。不缓冲内存中所有内容的替代方法是使用 io.Pipe .这种方法比较复杂,因为它在程序中引入了并发。此外,在 Render 中检测到可能的错误之前,http 客户端开始将请求写入线路。

r, w := io.Pipe()
go func() {
    w.CloseWithError(html.Render(w, msg))
}()
req, err := http.NewRequest("POST", url, r)

关于go - 如何 "bridge"writer 和 reader in go,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35254527/

相关文章:

mysql - 使用 std 为多对多关系建模结构

go - 在 C 共享库中公开一个带有 2D slice 作为参数的函数(通过 JNA 和 C 在 Java 中使用)

email - "missing word in phrase: charset not supported", 使用邮件包时

go - 如何将 map 中的值与一组已知值进行比较

arrays - 在 Go slice 或数组中查找唯一项

go - 交叉编译到 ARMv7 失败

go - 在 Go 模板中对 Alertmanager 电子邮件模板进行排序

json - 如何在没有 rest API key 的情况下将结构转换为 json

file - 戈兰 : Getting "fatal error: all goroutines are asleep - deadlock" on waitGroup. 等待()

go - 以编程方式获取 golang 覆盖率