猿问

如何在golang的Web应用程序中缓冲响应?

我想制作一个可以正确捕获模板错误的 hello world Web 应用程序。所以我需要缓冲响应但不知道该怎么做。我已经把这段代码放在一起了。这是在 golang 中缓冲响应的方式吗?


func get_handler(w http.ResponseWriter, r *http.Request) {


    buf := new(bytes.Buffer)

    err := templates.ExecuteTemplate(buf, "hello.html", nil)

    if err != nil {

        fmt.Println(err.Error())

        http.Error(w, err.Error(), http.StatusInternalServerError)

        return

    }

    w.Write([]byte(buf.String()))

}


江户川乱折腾
浏览 172回答 3
3回答

犯罪嫌疑人X

bytes.Buffer有一个Bytes方法,因此您实际上不需要调用String并将其转换为[]byte:w.Write(buf.Bytes())此外,将错误写入 stderr 是一种很好的做法。只需将您的替换fmt为log:if err != nil {    log.Println(err)    http.Error(w, err.Error(), http.StatusInternalServerError)    return}

慕村225694

bytes.Buffer有一个内置的方法来写出一个io.Writer:func get_handler(w http.ResponseWriter, r *http.Request) {    buf := new(bytes.Buffer)    //fill buffer    _,err := buf.WriteTo(w)    if err != nil {          log.Println(err)    }}文档:http : //golang.org/pkg/bytes/#Buffer.WriteTo

婷婷同学_

您可以bytes.Buffer通过写入“原样”来使用它,但代价是在每个请求上都丢弃缓冲区。使用池化方法(在使用之间安全地重置内容,但保留缓冲区)可以获得一些收益:var bufPool *bpool.BufferPoolfunc YourHandler(w http.ResponseWriter, r *http.Request) {    buf := bufPool.Get()    defer bufPool.Put(buf)    err := template.ExecuteTemplate(buf, "forms/create.html", user)    // or err := json.NewEncoder(buf).Encode(value)    if err != nil {      return err    }    buf.WriteTo(w)}这使用bpool库。
随时随地看视频慕课网APP

相关分类

Go
我要回答