问题描述

MySQL查询函数返回行巫的数组定义为

A mySQL Query function returns an array of rows witch is defined as

type Row []interface{}

我要检查,如果返回的数组是空的,但我得到一个运行时的恐慌:

I would like to check if the returned array is empty, but I get a runtime panic:

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 {

这位前pression LEN(行)似乎会导致运行时的恐慌,如果行是空的。

The expression len(rows) seems to cause the runtime panic if rows is empty.

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

How can I check for an empty array? I tried also rows == nil, which also panics.

推荐答案

 QueryRow 
QueryRow

QueryRow执行,预计将最多返回行的查询。 QueryRow总是返回一个非零值。错误被推迟到行的扫描方法被调用。

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.Scan

ErrNoRows被扫描时返回QueryRow不会返回一行。在这种情况下,QueryRow返回推迟这一错误,直到扫描的占位符*行值。

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.

所以,你想要做的是一样的东西:

So what you want to do is something like:

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 
rows.Next
defer rows.Close()
has_results := false
for rows.Next() {
    has_results := true
    //do stuff
}
if (!has_results) {
    //error handling
}

这篇关于Golang:如何检查空数组(结构数组)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!