panic: runtime error問題分享
panic: runtime error: invalid memory address or nil pointer dereference
關於這個錯誤問題panic: runtime error: invalid memory address or nil pointer dereference,我是如何解決的
一般這個問題的出現,從提示上意思意思是無效的記憶體地址或空指標
我遇到的問題是這樣的我寫了一個Session管理器,其中有一個函式是這樣的
// SessionStart 啟動Session功能 func (m *Manager) SessionStart(w http.ResponseWriter, r *http.Request) (session Session, err error) { m.lock.Lock() defer m.lock.Unlock() cookie, err := r.Cookie(m.cookieName) if err != nil || cookie.Value == "" { sid := m.GenerateSID() session, err = m.provider.SessionInit(sid) if err != nil { return nil, err } newCookie := http.Cookie{ Name:m.cookieName, Value:url.QueryEscape(sid), Path:"/", HttpOnly: true, MaxAge:int(m.maxLifeTime), } http.SetCookie(w, &newCookie) } else { sid, _ := url.QueryUnescape(cookie.Value) session, _ = m.provider.SessionRead(sid) } return }
然後我在使用的時候,是這樣的
var appSession *session.Manager // WelcomeLogin 歡迎登入頁 func WelcomeLogin(w http.ResponseWriter, r *http.Request) { _, err := appSession.SessionStart(w, r) if err != nil { fmt.Println(err) return } cookie, err := r.Cookie("sessionid") if err != nil { fmt.Fprintf(w, "session") } fmt.Fprintf(w, cookie.Value) } func init() { appSession, _ := session.GetManager("memory", "sessionid", 3600) go appSession.SessionGC() }
這段兩端程式碼正常編譯是沒有任何問題,但是在呼叫WelcomeLogin的時候就報錯了,因為WelcomeLogin函式呼叫了SessionStart,而SessionStart又呼叫了m.lock.Lock()。
這裡注意m.lock.Lock()中的m,從錯誤提示上看是m的郭,問題在哪裡呢,我通過記錄日誌的方式找到了原因,其實
appSession, _ := session.GetManager("memory", "sessionid", 3600)
這段程式碼和下面
appSession, _ = session.GetManager("memory", "sessionid", 3600)
這段程式碼是有很大區別的
使用第一段的時候
appSession得到的值是nil,而使用第二段的程式碼的時候就能正常賦值了。
這個問題在以後使用init進行操作變數重新賦值的時候一定要注意。為什麼我能突然想到這個問題,因為我之前的幾篇文章是寫如何使用SQL/">MySQL的,其中有個init中初始化的時候,重新賦值連線的變數涉及到這個問題,但是的做法就是直接賦值,並沒有通過':='的方式賦值
// MySQLDB Conn var MySQLDB *sql.DB func init() { db, err := sql.Open("mysql", "root:123456@/wiki?charset=utf8") MySQLDB = db checkErr(err) }