gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:20:51 26 4
gpt4 key购买 nike

将我的代码从 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 的工作原理——立即评估参数。 From the docs :

Each time a "defer" statement executes, the function value and parameters to the call are evaluated as usual and saved anew but the actual function is not invoked.

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

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

因此在 defer 时没有要计算的参数。

关于debugging - 从 Windows 交叉编译到 Linux 时出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54234156/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com