从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] 删除。
我来说两句