Golang:如何检查空数组(struct数组)

时间:2015-01-19 22:32:16

标签: arrays go

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,这也很恐慌。

1 个答案:

答案 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
}