jjzjj

go - 运行时错误 :Invalid memory Address or nil pointer dereference-golang

coder 2024-07-14 原文

我是 golang 的新手,正在尝试开发一个带有 session 的登录页面。代码构建成功,但是当我在浏览器中运行时,它说 404 页面未找到。任何人都可以帮助我。提前致谢。 这是我的代码

// main.go
package main

import (
        _ "HarishSession/routers"
       "github.com/astaxie/beego"
      "fmt"
        "net/http"
         "html/template"
            "strings"
              "log"
              "github.com/astaxie/beego/session"
               "sync"


    )


 var globalSessions *session.Manager
 var provides = make(map[string]Provider)

 func sayhelloName(w http.ResponseWriter, r *http.Request) {
            r.ParseForm()  // parse arguments, you have to call this by yourself
            fmt.Println("the information of form is",r.Form)  // print form information in server side
            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!") // send data to client side
}



type Manager struct {
    cookieName  string     //private cookiename
    lock        sync.Mutex // protects session
    provider    Provider
    maxlifetime int64
}


type Provider interface {
    SessionInit(sid string) (Session, error)
    SessionRead(sid string) (Session, error)
    SessionDestroy(sid string) error
    SessionGC(maxLifeTime int64)
}
type Session interface {
    Set(key, value interface{}) error //set session value
    Get(key interface{}) interface{}  //get session value
    Delete(key interface{}) error     //delete session value
    SessionID() string                //back current sessionID
}



func NewManager(provideName, cookieName string, maxlifetime int64) (*Manager, error) {
    provider, ok := provides[provideName]
    if !ok {
        return nil, fmt.Errorf("session: unknown provide %q (forgotten import?)", provideName)
    }
    return &Manager{provider: provider, cookieName: cookieName, maxlifetime: maxlifetime}, nil
}


func login(w http.ResponseWriter, r *http.Request) {

sess := globalSessions.SessionStart(w,r)
r.ParseForm()

fmt.Println("method:", r.Method)
if r.Method == "GET" {
t, _ := template.ParseFiles("login.tpl")
w.Header().Set("Content-Type", "text/html")
t.Execute(w,sess.Get("username"))
} else {
//logic part of log in
fmt.Println("username:",r.Form["username"])
fmt.Println("password:",r.Form["password"])
http.Redirect(w,r,"/",302)
}
}



func main() {
var globalSessions *session.Manager
 http.HandleFunc("/", sayhelloName)
 http.HandleFunc("/login", login)
    err := http.ListenAndServe(":8080", nil) // set listen port
    if err != nil {
        log.Fatal("ListenAndServe the error is: ", err)
    }
    fmt.Println("hello")
    beego.Run()


    fmt.Println(globalSessions)
}


//router.go
package routers

import (
    "HarishSession/controllers"
    "github.com/astaxie/beego"
)

func init() {
    beego.Router("/", &controllers.MainController{})
    beego.Router("/login", &controllers.MainController{})
}


//default.go
package controllers

import (
    "github.com/astaxie/beego"
)

type MainController struct {
    beego.Controller
}

func (this *MainController) Get() {
    this.Data["Website"] = "beego.me"
    this.Data["Email"] = "astaxie@gmail.com"
    this.TplNames = "index.tpl"
    this.TplNames="login.tpl"
}

最佳答案

您有两个不同作用域的变量,每个变量都称为 globalSessions。一个是你在main.go中定义的,定义在全局范围内,另一个是在main函数中定义的,定义为的局部变量>主要。这些是单独的变量。您的代码犯了将它们混为一谈的错误。

您可以通过密切关注堆栈跟踪条目来了解这一点:

github.com/astaxie/beego/session.(*Manager).SessionStart(0x0, 0x151e78, 0xc08212 0000, 0xc082021ad0, 0x0, 0x0) 

因为这指向 globalSessions 由于 nil 而未初始化。之后,故障排除是直接查看程序以查看哪些内容触及 globalSessions

请注意,您应该将堆栈跟踪作为您问题的一部分。不要只是将其添加为评论。包含此信息至关重要:否则我们将无法轻松追踪问题。请提高问题的质量,以便人们更容易为您提供帮助。

另外,你可能想认真看看 go vet ,这是一种有助于捕获此类问题的工具。

关于go - 运行时错误 :Invalid memory Address or nil pointer dereference-golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26687472/

有关go - 运行时错误 :Invalid memory Address or nil pointer dereference-golang的更多相关文章

随机推荐