panic: runtime error问题分享

分手后的思念是犯贱 2022-03-01 05:30 523阅读 0赞

panic: runtime error: invalid memory address or nil pointer dereference

关于这个错误问题panic: runtime error: invalid memory address or nil pointer dereference,我是如何解决的

一般这个问题的出现,从提示上意思意思是无效的内存地址或空指针
我遇到的问题是这样的我写了一个Session管理器,其中有一个函数是这样的

  1. // SessionStart 启动Session功能
  2. func (m *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (session Session, err error) {
  3. m.lock.Lock()
  4. defer m.lock.Unlock()
  5. cookie, err := r.Cookie(m.cookieName)
  6. if err != nil || cookie.Value == "" {
  7. sid := m.GenerateSID()
  8. session, err = m.provider.SessionInit(sid)
  9. if err != nil {
  10. return nil, err
  11. }
  12. newCookie := http.Cookie{
  13. Name: m.cookieName,
  14. Value: url.QueryEscape(sid),
  15. Path: "/",
  16. HttpOnly: true,
  17. MaxAge: int(m.maxLifeTime),
  18. }
  19. http.SetCookie(w, &newCookie)
  20. } else {
  21. sid, _ := url.QueryUnescape(cookie.Value)
  22. session, _ = m.provider.SessionRead(sid)
  23. }
  24. return
  25. }

然后我在使用的时候,是这样的

  1. var appSession *session.Manager
  2. // WelcomeLogin 欢迎登录页
  3. func WelcomeLogin(w http.ResponseWriter, r *http.Request) {
  4. _, err := appSession.SessionStart(w, r)
  5. if err != nil {
  6. fmt.Println(err)
  7. return
  8. }
  9. cookie, err := r.Cookie("sessionid")
  10. if err != nil {
  11. fmt.Fprintf(w, "session")
  12. }
  13. fmt.Fprintf(w, cookie.Value)
  14. }
  15. func init() {
  16. appSession, _ := session.GetManager("memory", "sessionid", 3600)
  17. go appSession.SessionGC()
  18. }

这段两端代码正常编译是没有任何问题,但是在调用WelcomeLogin的时候就报错了,因为WelcomeLogin函数调用了SessionStart,而SessionStart又调用了m.lock.Lock()。
这里注意m.lock.Lock()中的m,从错误提示上看是m的郭,问题在哪里呢,我通过记录日志的方式找到了原因,其实

  1. appSession, _ := session.GetManager("memory", "sessionid", 3600)

这段代码和下面

  1. appSession, _ = session.GetManager("memory", "sessionid", 3600)

这段代码是有很大区别的
使用第一段的时候
appSession得到的值是nil,而使用第二段的代码的时候就能正常赋值了。

这个问题在以后使用init进行操作变量重新赋值的时候一定要注意。为什么我能突然想到这个问题,因为我之前的几篇文章是写如何使用MySQL的,其中有个init中初始化的时候,重新赋值连接的变量涉及到这个问题,但是的做法就是直接赋值,并没有通过’:=’的方式赋值

  1. // MySQLDB Conn
  2. var MySQLDB *sql.DB
  3. func init() {
  4. db, err := sql.Open("mysql", "root:123456@/wiki?charset=utf8")
  5. MySQLDB = db
  6. checkErr(err)
  7. }

发表评论

表情:
评论列表 (有 0 条评论,523人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Runtime Error—顺序表

    runtime error(运行时错误)就是程序运行到一半,程序就崩溃了。 大多数情况是因为程序员对内存的理解不透彻导致错误应用引起的 以下为几个常见的: ①除以零