可能是一个简单的问题,但我在延迟请求处理函数中的输出时遇到问题。当我执行我的模板而不是响应编写器时,我正在使用“bufio”来写入,但似乎缓冲区只能在它吐出来之前保持这么多。我担心它会吐出部分页面,然后遇到错误,留下不完整和难以理解的响应。什么是确保一切都保持缓冲直到它准备好被释放到野外的最佳策略?
答案 0 :(得分:6)
如果要完全缓冲输出,请使用bytes.Buffer
,例如:
var bufferPool = &sync.Pool{
New: func() interface{} {
return &bytes.Buffer{}
},
}
func getBuffer() (buf *bytes.Buffer) {
return bufferPool.Get().(*bytes.Buffer)
}
func putBuffer(buf *bytes.Buffer) {
buf.Reset()
bufferPool.Put(buf)
}
func handler(w http.ResponseWriter, req *http.Request) {
buf := getBuffer()
defer putBuffer(buf)
//....
fmt.Fprintf(buf, .....)
buf.WriteTo(w)
}
答案 1 :(得分:0)
你可以使用bytes.Buffer
func Handler(w http.ResponseWriter, req *http.Request) {
tmp, err := template.New("hello").Parse("Hello {{.World}}")
if err != nil {
http.Error(w, "Error", 500)
return
}
buf := &bytes.Buffer{}
if err := tmp.Execute(buf, map[string]string{"World": "World"}); err != nil {
http.Error(w, "Error", 500)
return
}
w.Write(buf.Bytes())
}