Ошибка времени выполнения: неверный адрес памяти или нулевой указатель

Я новичок в golang, пытаюсь разработать страницу входа с сессий. код строится успешно, но когда я запускаю браузер, его страница 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"
}

2 ответа

У вас есть две переменные в разных областях, каждая из которых называется globalSessions, Один в вашем определении в main.go, который определяется в глобальной области видимости, а другой определяется в main функция, и определяется как локальная переменная main, Это отдельные переменные. Ваш код делает эту ошибку, объединяя их.

В этом можно убедиться, уделив больше внимания записи трассировки стека:

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

как это указывает на globalSessions будучи неинициализированным из-за того, что nil, После этого устранение неполадок является прямым вопросом просмотра программы, чтобы увидеть, что касается globalSessions,

Обратите внимание, что вы должны включить трассировку стека как часть вашего вопроса. Не просто добавьте это как комментарий. Крайне важно включить эту информацию: иначе мы не смогли бы легко отследить проблему. Пожалуйста, улучшайте качество своих вопросов, чтобы людям было проще помочь.

Кроме того, вы можете серьезно взглянуть на go vet, который является инструментом, который помогает поймать подобные проблемы.

Так как это одна строка, которую вы использовали в коде:

t, _ := template.ParseFiles("login.tpl")

Так что вам нужно проверить, является ли файл login.tpl находится в правильном месте, где оно должно быть, или нет. Если нет то correct the reference of it а также проверьте то же самое для других ссылок.

Это помогло мне.

Другие вопросы по тегам