将我的代码从 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
。
- 1 回答
- 0 关注
- 98 浏览
添加回答
举报
0/150
提交
取消