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

比萨主:

从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
    }

当我将defer放在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())

有人可以确认这是一个错误,还是我在这里遗漏了一些东西?

阿德里安:

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

    defer erh.Check(rows.Close())    

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

每次执行“ defer”语句时,都会照常评估调用的函数值和参数并重新保存,但不会调用实际函数。

如果要使用这样的构造,则它必须位于闭包内,例如:

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

因此,在时没有要评估的参数defer

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章