Http 去紧急服务
我感到恐慌:Http 去紧急服务,http,templates,web,go,panic,Http,Templates,Web,Go,Panic,我感到恐慌: C:\Users\loow\Desktop\USBWebserver v8.5\duplicate_submissions>go run server.go 2015/10/23 13:00:39 http: panic serving [::1]:63867: runtime error: invalid memo ry address or nil pointer dereference goroutine 5 [running]: net/http.(*conn).se
C:\Users\loow\Desktop\USBWebserver v8.5\duplicate_submissions>go run server.go
2015/10/23 13:00:39 http: panic serving [::1]:63867: runtime error: invalid memo
ry address or nil pointer dereference
goroutine 5 [running]:
net/http.(*conn).serve.func1(0xc0820a1810, 0x3b55b8, 0xc082024040)
c:/go/src/net/http/server.go:1287 +0xbc
main.login(0x2990058, 0xc0820d4000, 0xc0820be1c0)
C:/Users/loow/Desktop/USBWebserver v8.5/duplicate_submissions/server.go:
27 +0x5a5
net/http.HandlerFunc.ServeHTTP(0x8326a8, 0x2990058, 0xc0820d4000, 0xc0820be1c0)
c:/go/src/net/http/server.go:1422 +0x41
net/http.(*ServeMux).ServeHTTP(0xc082062360, 0x2990058, 0xc0820d4000, 0xc0820be1
c0)
c:/go/src/net/http/server.go:1699 +0x184
net/http.serverHandler.ServeHTTP(0xc08200c360, 0x2990058, 0xc0820d4000, 0xc0820b
e1c0)
c:/go/src/net/http/server.go:1862 +0x1a5
net/http.(*conn).serve(0xc0820a1810)
c:/go/src/net/http/server.go:1361 +0xbf5
created by net/http.(*Server).Serve
c:/go/src/net/http/server.go:1910 +0x3fd
2015/10/23 13:00:39 http: panic serving [::1]:63868: runtime error: invalid memo
ry address or nil pointer dereference
goroutine 33 [running]:
net/http.(*conn).serve.func1(0xc082114000, 0x3b55b8, 0xc082112000)
c:/go/src/net/http/server.go:1287 +0xbc
main.login(0x2990058, 0xc0821140b0, 0xc0821200e0)
C:/Users/loow/Desktop/USBWebserver v8.5/duplicate_submissions/server.go:
27 +0x5a5
net/http.HandlerFunc.ServeHTTP(0x8326a8, 0x2990058, 0xc0821140b0, 0xc0821200e0)
c:/go/src/net/http/server.go:1422 +0x41
net/http.(*ServeMux).ServeHTTP(0xc082062360, 0x2990058, 0xc0821140b0, 0xc0821200
e0)
c:/go/src/net/http/server.go:1699 +0x184
net/http.serverHandler.ServeHTTP(0xc08200c360, 0x2990058, 0xc0821140b0, 0xc08212
00e0)
c:/go/src/net/http/server.go:1862 +0x1a5
net/http.(*conn).serve(0xc082114000)
c:/go/src/net/http/server.go:1361 +0xbf5
created by net/http.(*Server).Serve
c:/go/src/net/http/server.go:1910 +0x3fd
exit status 2
使用此代码:
package main
import(
"fmt"
"net/http"
"html/template"
"log"
"time"
"crypto/md5"
"io"
"strconv"
)
func loginForm(w http.ResponseWriter, r *http.Request){
}
func login(w http.ResponseWriter, r *http.Request){
fmt.Println(r.Method)
if r.Method == "GET"{
cruTime := time.Now().Unix()
h := md5.New()
io.WriteString(h,strconv.FormatInt(cruTime,10))
token := fmt.Sprintf("%x", h.Sum(nil))
fmt.Println(token)
t, err := template.ParseFiles("templates/index.gtpl")
fmt.Println(err.Error())
err = t.Execute(w, token)
fmt.Println(err.Error())
} else{
r.ParseForm()
token := r.Form.Get("token")
if token != ""{
fmt.Println(token)
} else{
fmt.Println("There is no token")
}
fmt.Println("username length: ", len(r.Form["username"][0]))
fmt.Println("username: ", template.HTMLEscapeString(r.Form.Get("username")))
fmt.Println("password: ", template.HTMLEscapeString(r.Form.Get("password")))
template.HTMLEscape(w, []byte(r.Form.Get("username")))
}
}
func main(){
http.HandleFunc("/", loginForm)
http.HandleFunc("/login", login)
err := http.ListenAndServe(":9090", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
我无法修复它,我尝试了在stackoverflow中找到的所有东西。有什么问题?没有错误,恐慌者说t中的问题,err:=template.ParseFiles(“templates/index.gtpl”)
有一个模板文件:
<input type="checkbox" name="interest" value="football">Football
<input type="checkbox" name="interest" value="basketball">Basketball
<input type="checkbox" name="interest" value="tennis">Tennis
Username: <input type="text" name="username">
Password: <input type="password" name="password">
<input type="hidden" name="token" value="{{.}}">
<input type="submit" value="Login">
足球
篮球
网球
用户名:
密码:
紧急堆栈跟踪为您提供以下信息:
2015/10/23 13:00:39 http: panic serving [::1]:63868: runtime error: invalid memory address or nil pointer dereference goroutine 33 [running]:
这意味着您试图访问不存在的内容(nil指针)
那么文件中的第一行是:
v8.5/duplicate_submissions/server.go:27
这就是:
26: t, err := template.ParseFiles("templates/index.gtpl")
27: fmt.Println(err.Error())
28: err = t.Execute(w, token)
这意味着错误为零
解决方案
如果出现错误,则无法继续此过程。这就是为什么不能直接打印错误的原因。为了优雅地停止进程,需要返回HTTP状态码,然后返回。对于上述情况,您可以返回代码500(内部服务器错误)
对于template.ParseFiles和t.Execute也必须这样做
顺便说一下,这被称为“逗号确定”模式。紧急堆栈跟踪为您提供以下信息:
2015/10/23 13:00:39 http: panic serving [::1]:63868: runtime error: invalid memory address or nil pointer dereference goroutine 33 [running]:
这意味着您试图访问不存在的内容(nil指针)
那么文件中的第一行是:
v8.5/duplicate_submissions/server.go:27
这就是:
26: t, err := template.ParseFiles("templates/index.gtpl")
27: fmt.Println(err.Error())
28: err = t.Execute(w, token)
这意味着错误为零
解决方案
如果出现错误,则无法继续此过程。这就是为什么不能直接打印错误的原因。为了优雅地停止进程,需要返回HTTP状态码,然后返回。对于上述情况,您可以返回代码500(内部服务器错误)
对于template.ParseFiles和t.Execute也必须这样做
顺便说一句,这就是所谓的“逗号确定”模式,你调用的是
err.Error()
,而没有检查err
是否为nil
。是的,但我只是尝试修复错误,如果我删除它,恐慌仍然存在。删除err.Error(),然后重试。如果err
为nil
,你调用的是空指针上的方法,这会导致segfault。对nil
值调用方法。这是一种恐慌的方法,因为它试图访问一些不可访问的字符串。您正在调用err.Error()
,但没有检查err
是否为nil
。是的,但我只是尝试修复错误,如果我删除它,恐慌仍然存在。删除err.Error(),然后重试。如果err
为nil
,则,您正在对空指针调用方法,这将导致segfault。对nil
值调用方法。这个方法之所以会惊慌失措,是因为它试图访问一些无法访问的字符串。@DaveC很好。它是fixed@DaveC抢手货已经修好了