我正在使用該github.com/go-sql-driver/mysql庫與我的 MySQL 數據庫進行交互。一切正常,除非我的查詢超過 20 條記錄。查詢返回結果集很好,但是當我循環到第 21 條記錄時,它會出現恐慌。我以這種方式查詢我的數據庫:row, err = store.db.Query(myquerystring)我正在提取返回值,如下所示:indx = 0for row.Next() { err = row.Scan( &mySlice[indx].Val1, &mySlice[indx].Val2 ) if err != nil { if err == sql.ErrNoRows { log.Print("No records found") } else { log.Printf("Error retrieving data: %s", err.Error()) } } indx++}我得到的錯誤不是來自我的錯誤處理,它在檢索第 21 條記錄時立即發生。我將登錄作為 for 循環中的第一件事和最后一件事,我得到了第 20 條記錄末尾的日志,但沒有寫入第 21 條記錄的第一個日志,因此這似乎是導致恐慌的行for row.Next()。我得到的錯誤是:http: panic serving xxx.xxx.xxx.xxx:xxxxx: runtime error: invalid memory address or nil pointer dereference這就是我初始化切片的方式:**sqlstring 與上面的查詢相同,只是所有字段都從 select 中刪除并且僅count(tableid)返回 a 。row, err := store.db.Query(sqlString)row.Next()err = row.Scan( &count,)var mySlice = make([]mystruct, count)
1 回答

慕標琳琳
TA貢獻1830條經驗 獲得超9個贊
首先感謝您提出堆棧跟蹤請求,它使我能夠仔細分析堆棧跟蹤,從而找到解決方案。
有兩個問題。
我用于填充切片的函數還有另外 2 個函數,這些函數被調用以填充父結構中的結構,因為父結構中返回的記錄數量超出了填充父結構之前可用的最大連接數。在這些函數中顯式關閉行對象解決了此錯誤。
第二個是我有一個 for 循環,我從 1 循環到記錄計數,因為我想將 1 的值存儲到“X”而不是 0 到“X-1”,但這顯然導致索引超出范圍錯誤(菜鳥錯誤)。只需正常循環并將“X+1”存儲在變量中即可輕松解決此問題。
感謝所有的評論,他們幫助我找到了自己的問題,非常感謝。
- 1 回答
- 0 關注
- 183 瀏覽
添加回答
舉報
0/150
提交
取消