Ошибка времени выполнения: неверный адрес памяти или нулевой указатель
Я новичок в 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
а также проверьте то же самое для других ссылок.
Это помогло мне.