为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕田峪4524236 2021-09-13 09:46:23
mySQL 查询函数返回一个行数组,定义为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 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

看起来您可以使用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

}

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


defer rows.Close()

has_results := false

for rows.Next() {

    has_results = true

    //do stuff

}

if (!has_results) {

    //error handling

}


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信