gpt4 book ai didi

golang 传递 http.ResponseWriter

转载 作者:IT王子 更新时间:2023-10-29 01:37:23 26 4
gpt4 key购买 nike

我想弄清楚是否有可能在编写 Web 应用程序时不必随处传递 http.ResponseWriter。我正在设置一个简单的 mvc web 框架,我发现自己必须通过各种函数传递 http.ResponseWriter,而它只用于让我们说最后一个函数。

路线包

// Struct containing http requests and variables
type UrlInfo struct {
Res http.ResponseWriter
Req *http.Request
Vars map[string]string
}

func HandleFunc(handlepath string, runfunc func(*UrlInfo)) {
// Set handler and setup struct
http.HandleFunc(getHandlePath(handlepath), func(w http.ResponseWriter, r *http.Request) {
url := new(UrlInfo)
url.Res = w
url.Req = r
url.Vars = parsePathVars(r.URL.Path, handlepath)

runfunc(url)
})
}

// Parse file and send to responsewriter
func View(w http.ResponseWriter, path string, data interface{}) {
// Go grab file from views folder
temp, err := template.ParseFiles(path+".html")
if err != nil {
// Couldnt find html file send error
http.Error(w, err.Error(), http.StatusInternalServerError)
} else {
temp.ExecuteTemplate(w, temp.Name(), data)
}
}

Controller 包

import (
"routes"
)

func init() {
// Build handlefunc
routes.HandleFunc("/home/", home)
}

func home(urlinfo *routes.UrlInfo) {
info := make(map[string]string)
info["Title"] = urlinfo.Vars["title"]
info["Body"] = "Body Info"

gi.View(urlinfo.Res, "pages/about", info)
}

我不想在 home 函数中传递任何东西,这样我就可以将它再次传递给 View 函数以吐出。能够将它放在一个地方并在需要时从中拉出会很好。对于以相同方式与路由包进行通信的多个包,这也很好。

欢迎任何想法、提示或技巧。谢谢。

最佳答案

有多种方法可以做到这一点。诀窍是从您正在通过的 ResponseWriter 中弄清楚您实际需要什么。听起来你只需要练习一点函数组合。

更改您的设计,以便 View 返回一个 io.Reader 和一个错误,然后您可以将其通过管道传输到 ResponseWriter。这是一个完全未经测试的示例:

func View(path string, data interface{}) (io.Reader, error) {
// Go grab file from views folder
temp, err := template.ParseFiles(path+".html")
if err != nil {
// Couldnt find html file send error
return nil, err
} else {
buf := bytes.Buffer()
temp.ExecuteTemplate(buf, temp.Name(), data)
return buf
}
}

func HandleFunc(handlepath string, runfunc func(*UrlInfo) (io.Reader, error)) {
// Set handler and setup struct
http.HandleFunc(getHandlePath(handlepath),
func(w http.ResponseWriter, r *http.Request) {
url := new(UrlInfo)
url.Res = w
url.Req = r
url.Vars = parsePathVars(r.URL.Path, handlepath)

rdr, err := runfunc(url)
io.Copy(w, rdr);
})
}

有了这个,唯一需要担心 http ResponseWriter 的就是你的 HandleFunc 函数。

关于golang 传递 http.ResponseWriter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12519660/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com