在完成所有错误检查之前,如何防止在Go中生成输出?

时间:2014-09-08 19:44:19

标签: templates error-handling go buffer

可能是一个简单的问题,但我在延迟请求处理函数中的输出时遇到问题。当我执行我的模板而不是响应编写器时,我正在使用“bufio”来写入,但似乎缓冲区只能在它吐出来之前保持这么多。我担心它会吐出部分页面,然后遇到错误,留下不完整和难以理解的响应。什么是确保一切都保持缓冲直到它准备好被释放到野外的最佳策略?

2 个答案:

答案 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())
}