首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go http panic serving

Go http panic serving
EN

Stack Overflow用户
提问于 2015-10-23 19:07:55
回答 1查看 9.7K关注 0票数 0

我有这样的恐慌:

代码语言:javascript
复制
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

点击下面的代码:

代码语言:javascript
复制
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)
    }
}

我不能修复它,我尝试了我在堆栈溢出中找到的所有东西。有什么问题吗?没有错误,死机说问题在t,err :=模板(“template.ParseFiles/index.gtpl”)..

下面是模板文件:

代码语言:javascript
复制
<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">
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-23 23:10:38

死机堆栈跟踪向您提供以下信息:

代码语言:javascript
复制
2015/10/23 13:00:39 http: panic serving [::1]:63868: runtime error: invalid memory address or nil pointer dereference goroutine 33 [running]:

这意味着你正在尝试访问一些不存在的东西(空指针)。

那么来自你的文件的第一行是下面这一行:

代码语言:javascript
复制
v8.5/duplicate_submissions/server.go:27

它就在那里:

代码语言:javascript
复制
26: t, err := template.ParseFiles("templates/index.gtpl")
27: fmt.Println(err.Error())
28: err = t.Execute(w, token)

这意味着err为零。

解决方案

如果收到该错误,则无法继续该过程。这就是为什么你不能仅仅打印出错误的原因。为了优雅地停止该进程,您需要返回一个HTTP状态代码,然后返回。对于上面的情况,您可以返回代码500 (内部服务器错误)。

代码语言:javascript
复制
t, err := template.ParseFiles("templates/index.gtpl")
if err != nil {
  fmt.Println(err) // Ugly debug output
  w.WriteHeader(http.StatusInternalServerError) // Proper HTTP response
  return
}

对于template.ParseFiles和t.Execute也必须这样做。

顺便说一下,这就是所谓的“逗号ok”模式。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33300868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档