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

Mic*_*ael 2 arrays go

mySQL 查询函数返回一个行数组,定义为

type Row []interface{}
Run Code Online (Sandbox Code Playgroud)

我想检查返回的数组是否为空,但出现运行时恐慌:

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 {
Run Code Online (Sandbox Code Playgroud)

如果行为空,表达式 len(rows) 似乎会导致运行时恐慌。

如何检查空数组?我也试过行 == 零,这也恐慌。

dav*_*ave 6

看起来您可以使用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
}
Run Code Online (Sandbox Code Playgroud)

否则,由于您rows.Next无论如何都需要循环,您可以轻松设置一个标志:

defer rows.Close()
has_results := false
for rows.Next() {
    has_results = true
    //do stuff
}
if (!has_results) {
    //error handling
}
Run Code Online (Sandbox Code Playgroud)