处理超过20条记录时出现问题

我正在使用该github.com/go-sql-driver/mysql库与我的 MySQL 数据库进行交互。一切正常,除非我的查询超过 20 条记录。查询返回结果集很好,但是当我循环到第 21 条记录时,它会出现恐慌。


我以这种方式查询我的数据库:


row, err = store.db.Query(myquerystring)

我正在提取返回值,如下所示:


indx = 0

for 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)


临摹微笑
浏览 119回答 1
1回答

慕标琳琳

首先感谢您提出堆栈跟踪请求,它使我能够仔细分析堆栈跟踪,从而找到解决方案。有两个问题。我用于填充切片的函数还有另外 2 个函数,这些函数被调用以填充父结构中的结构,因为父结构中返回的记录数量超出了填充父结构之前可用的最大连接数。在这些函数中显式关闭行对象解决了此错误。第二个是我有一个 for 循环,我从 1 循环到记录计数,因为我想将 1 的值存储到“X”而不是 0 到“X-1”,但这显然导致索引超出范围错误(菜鸟错误)。只需正常循环并将“X+1”存储在变量中即可轻松解决此问题。感谢所有的评论,他们帮助我找到了自己的问题,非常感谢。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go