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

从 Windows 交叉编译到 Linux 时出现错误?

从 Windows 交叉编译到 Linux 时出现错误?

Go
ibeautiful 2023-06-01 16:29:07
将我的代码从 Win10 交叉编译到 Linux 时,以下代码停止使用 rows.next    executed rows.Next()    rows, err := DB.Query("SELECT * FROM `machines`")    erh.Check(err)    newUsers := make(map[string]User, count)    defer erh.Check(rows.Close())        for rows.Next() {        //tu is temp user        tu := User{}        err := rows.Scan(&tu.Id, &tu.Name, &tu.Apikey, &tu.Ip, &tu.Machine, &tu.State, &tu.DbAvailable)        erh.Check(err)        log.Println(tu)        newUsers[tu.Apikey] = tu    }当我将延迟放在 rows.Next 下时,执行了 rows.next 代码rows, err := DB.Query("SELECT * FROM `machines`")erh.Check(err)newUsers := make(map[string]User, count)for rows.Next() {    //tu is temp user    tu := User{}    err := rows.Scan(&tu.Id, &tu.Name, &tu.Apikey, &tu.Ip, &tu.Machine, &tu.State, &tu.DbAvailable)    erh.Check(err)    log.Println(tu)    newUsers[tu.Apikey] = tu}defer erh.Check(rows.Close())有人可以确认这是一个错误,还是我在这里遗漏了什么?
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

我不确定这在 Linux 上如何工作,它不应该。这一行:

    defer erh.Check(rows.Close())

rows.Close() 立即执行,保留返回值,然后延迟对 的调用erh.Check。这就是 defer 的工作原理——立即评估参数。从文档:

每次执行“defer”语句时,调用的函数值和参数都会像往常一样计算并重新保存,但不会调用实际函数。

如果你想使用这样的构造,它必须在一个闭包中,比如:

defer func() {
    erh.Check(rows.Close())
}()

所以在 的时候没有要评估的参数defer


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

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