mySQL Query函数返回一个定义为
的行数组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,这也很恐慌。
答案 0 :(得分:4)
看起来你可以使用QueryRow
,因为该查询只能返回一行。
QueryRow执行一个预计最多返回一行的查询。 QueryRow始终返回非零值。在调用Row的Scan方法之前,错误会被推迟。
在这种情况下,如果没有行,则ErrNoRows
会发生,但会延迟到.Scan
发生。
当QueryRow没有返回行时,Scan会返回ErrNoRows。在这种情况下,QueryRow返回占位符*行值,该值将此错误推迟到扫描。
所以你想要做的是:
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
}