我可以加载一个html页面(index.html),其中<body></body>
内容如下所示:
<form action="ask" method="get">
<input type="text" name="q" />
</form>
我想要的是渲染index.html然后在提交问题时渲染index.html的副本,除了一些内容来自我的golang代码作为结果页面。
当我在index.html中提交表单时,我会得到一个空白页。
但是当我转到localhost:8000 / view或时,我没有收到任何数据 localhost:8000 / view?q =浏览器中的hello + world。在终端,我得到了这个以及更多,但这是第一行:
http:panic serving [:: 1]:53803:运行时错误:无效的内存地址或无指针取消引用
这是什么意思,我该如何解决?
当我去/询问或/问?q = hello + world,这就是我想要做的,我得到的空白页没有错误。
我正在尝试处理已加载的初始页面上的问题,并在提交表格提交后在结果页面上处理。
index.html,view.html和edit.html都有:
<form method="get" action="ask">
<input type="text" name="q" />
</form>
现在是我的代码:
package main
import (
"fmt"
"net/http"
"github.com/zenazn/goji"
"github.com/zenazn/goji/web"
"html/template"
"io/ioutil"
)
type Page struct {
Title string
Body []byte
}
func (p *Page) save() error{
filename := p.Title + ".txt"
return ioutil.WriteFile(filename, p.Body, 0600)
}
func loadPage(title string) (*Page, error){
filename := title + ".txt"
body, err := ioutil.ReadFile(filename)
if err != nil{
return nil, err
}
return &Page{Title: title, Body: body}, nil
}
func renderTemplate(w http.ResponseWriter, tmpl string, p *Page){
t, err := template.ParseFiles(tmpl + ".html")
if err != nil{
fmt.Println(err)
}
t.Execute(w, p)
}
func viewHandler(w http.ResponseWriter, r *http.Request){
//title := r.URL.Path[len("/view/"):]
title := r.FormValue("q")
p, err := loadPage(title)
if err != nil{
fmt.Println(err)
}
renderTemplate(w, "view", p)
}
func editHandler(w http.ResponseWriter, r *http.Request){
//title := r.URL.Path[len("/edit/"):]
title := r.FormValue("q")
p, err := loadPage(title)
if err != nil{
p = &Page{Title: title}
fmt.Println(err)
}
renderTemplate(w, "edit", p)
}
func response(c web.C, w http.ResponseWriter, r *http.Request){
}
func serveSingle(filename string) func(w http.ResponseWriter, r *http.Request) {
return func(w http.ResponseWriter, r *http.Request) {
http.ServeFile(w, r, filename)
}
}
func main() {
goji.Get("/", serveSingle("Projects/Go/src/web/site/index.html"))
goji.Handle("/ask", response)
http.HandleFunc("/view/", viewHandler)
http.HandleFunc("/edit/", editHandler)
goji.Serve()
}
所以我想处理来自index.html和结果页面的问题并运行响应,这将在index.html和结果页面上提交问表单时呈现结果页面。
答案 0 :(得分:0)
使用正确的错误处理,您应该看到发生了什么。由于某种原因,它要么加载空白文件,要么无法找到文件,这就是结果页面为空白的原因。
如评论中所述:
在renderTemplate中,执行panic(err)
并检查t.Execute()
的返回值。在viewHandler中也执行panic(err)
。在editHandler中也一样,执行panic(err)
。
看看那些恐慌说什么并从那里开始。