mySQL 查询函数返回一个行数组,定义为type Row []interface{}我想检查返回的数组是否为空,但出现运行时恐慌:s := fmt.Sprintf("select id, secret, shortname from beehives where shortname = '%s'", beehive)rows, res, err := database.Query(s)if err == nil { if len(rows) != 1 {如果行为空,表达式 len(rows) 似乎会导致运行时恐慌。如何检查空数组?我也试过行 == nil,这也会引起恐慌。
1 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
看起来您可以使用QueryRow,因为该查询预计仅返回一行。
QueryRow 执行预计最多返回一行的查询。QueryRow 总是返回一个非零值。错误被推迟到调用 Row 的 Scan 方法。
在这种情况下,如果没有行,则ErrNoRows发生,但会推迟到.Scan发生。
当 QueryRow 不返回行时,Scan 返回 ErrNoRows。在这种情况下,QueryRow 返回一个占位符 *Row 值,该值将此错误推迟到扫描。
所以你想做的是:
var id int
var secret string
var shortname string
err := db.QueryRow("SELECT ...").Scan(&id, &secret, &shortname)
switch {
case err == sql.ErrNoRows:
log.Printf("Not found.")
case err != nil:
log.Fatal(err)
default:
//do stuff
}
否则,由于您rows.Next无论如何都需要循环,您可以轻松设置一个标志:
defer rows.Close()
has_results := false
for rows.Next() {
has_results = true
//do stuff
}
if (!has_results) {
//error handling
}
- 1 回答
- 0 关注
- 145 浏览
添加回答
举报
0/150
提交
取消