如何检查空数组(结构数组)
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
}
一个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
}