如何检查空数组(结构数组)

How to check for empty array (array of struct)

一个mySQL查询函数returns行数组定义为

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) 似乎会导致运行时恐慌。

如何检查空数组?我也试过 rows == nil,这也会引起恐慌。

您似乎可以使用 QueryRow,因为该查询预计只 return 一行。

QueryRow executes a query that is expected to return at most one row. QueryRow always return a non-nil value. Errors are deferred until Row's Scan method is called.

在这种情况下,如果没有行,则会发生 ErrNoRows,但会推迟到 .Scan 发生。

ErrNoRows is returned by Scan when QueryRow doesn't return a row. In such a case, QueryRow returns a placeholder *Row value that defers this error until a Scan.

所以你想做的是:

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
}