`http://127.0.0.1:9090/login`访问报错?
0

2018/06/21 15:15:26 http: panic serving 127.0.0.1:39146: runtime error: invalid memory address or nil pointer dereference
goroutine 35 [running]:
net/http.(*conn).serve.func1(0xc4201d6000)
    /home/aurora/.golang/go/src/net/http/server.go:1726 +0xd0
panic(0x7130a0, 0x94bd50)
    /home/aurora/.golang/go/src/runtime/panic.go:502 +0x229
html/template.(*Template).escape(0x0, 0x0, 0x0)
    /home/aurora/.golang/go/src/html/template/template.go:95 +0x2e
html/template.(*Template).Execute(0x0, 0x7b4fe0, 0xc4201640e0, 0x0, 0x0, 0xc420152210, 0x488bfd)
    /home/aurora/.golang/go/src/html/template/template.go:119 +0x2f
main.login(0x7b7ce0, 0xc4201640e0, 0xc420150100)
    /www/code/Go/web/login.go:29 +0x345
net/http.HandlerFunc.ServeHTTP(0x78be10, 0x7b7ce0, 0xc4201640e0, 0xc420150100)
    /home/aurora/.golang/go/src/net/http/server.go:1947 +0x44
net/http.(*ServeMux).ServeHTTP(0x95ae80, 0x7b7ce0, 0xc4201640e0, 0xc420150100)
    /home/aurora/.golang/go/src/net/http/server.go:2337 +0x130
net/http.serverHandler.ServeHTTP(0xc42008cdd0, 0x7b7ce0, 0xc4201640e0, 0xc420150100)
    /home/aurora/.golang/go/src/net/http/server.go:2694 +0xbc
net/http.(*conn).serve(0xc4201d6000, 0x7b7f60, 0xc42009a300)
    /home/aurora/.golang/go/src/net/http/server.go:1830 +0x651
created by net/http.(*Server).Serve
    /home/aurora/.golang/go/src/net/http/server.go:2795 +0x27b
method: GET

按照教程的代码执行报这个错,请问什么原因?

最佳答案

使用绝对路径,或者把html放到相对 生成的可执行文件 的路径

2个月前
讨论数量: 10

贴下代码

3个月前

@LiuKaHo 就是章节里的代码,没做改动

3个月前

@aurora 就是你这样。。我不知道你代码怎么写。。你就把你写的代码贴上来就好

3个月前

@LiuKaHo

package main

import (
    "fmt"
    "html/template"
    "log"
    "net/http"
    "strings"
)

func sayhelloName(w http.ResponseWriter, r *http.Request) {
    r.ParseForm()       // 解析 url 传递的参数,对于 POST 则解析响应包的主体(request body)
    // 注意:如果没有调用 ParseForm 方法,下面无法获取表单的数据
    fmt.Println(r.Form) // 这些信息是输出到服务器端的打印信息
    fmt.Println("path", r.URL.Path)
    fmt.Println("scheme", r.URL.Scheme)
    fmt.Println(r.Form["url_long"])
    for k, v := range r.Form {
        fmt.Println("key:", k)
        fmt.Println("val:", strings.Join(v, ""))
    }
    fmt.Fprintf(w, "Hello astaxie!") // 这个写入到 w 的是输出到客户端的
}

func login(w http.ResponseWriter, r *http.Request) {
    fmt.Println("method:", r.Method) // 获取请求的方法
    if r.Method == "GET" {
        t, _ := template.ParseFiles("login.html")
        log.Println(t.Execute(w, nil))
    } else {
        // 请求的是登录数据,那么执行登录的逻辑判断
        fmt.Println("username:", r.Form["username"])
        fmt.Println("password:", r.Form["password"])
    }
}

func main() {
    http.HandleFunc("/", sayhelloName)       // 设置访问的路由
    http.HandleFunc("/login", login)         // 设置访问的路由
    err := http.ListenAndServe(":9090", nil) // 设置监听的端口
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}
3个月前

@aurora 当前目录下有 login.html 文件吗?或者可以这样

t, err := template.ParseFiles("login.html")
if err != nil {
    fmt.Fprintf(w, "login.html is not exists")
} else {
    log.Println(t.Execute(w, nil))
}
3个月前

@LiuKaHo login.html是有的,加了判断,是进入了 if里面

file

3个月前

@aurora 那你把那个 err 打印出来看下是什么错误吧

3个月前

@LiuKaHo open login.html: no such file or directory 提示文件不存在 :joy:

3个月前

文件放到文件夹根目录

2个月前

使用绝对路径,或者把html放到相对 生成的可执行文件 的路径

2个月前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!