我通常在Golang找到读者和作家的方式,但我遇到了一个新的情况。
我正在使用" golang.org/x/net/html"渲染。它输出到作家w。我想使用该输出并从中创建一个新请求。 NewRequest使用Reader r。
err := html.Render(w, msg)
...
req, err := http.NewRequest("Post", url, r)
io.Copy(w, r)
我的问题是"使用w和r?"绑定两个调用的最佳/最佳解决方案是什么?我找不到网上类似情况的例子。我正在考虑创建Reader和Writer并在它们上使用io.Copy(w,r)。我不确定,因为对于经常使用的东西来说,这看起来有点复杂。
答案 0 :(得分:4)
一种简单的方法是使用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)