Debugging 从Windows交叉编译到Linux时出现错误?
将我的代码从Win10交叉编译到Linux时,以下代码停止使用rows.nextDebugging 从Windows交叉编译到Linux时出现错误?,debugging,go,Debugging,Go,将我的代码从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() {
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())
有人能确认这是一个bug,或者我遗漏了什么吗?我不确定这在Linux上如何工作,它不应该。这一行:
defer erh.Check(rows.Close())
将立即执行rows.Close()
,保留返回值,然后仅延迟对erh的调用。检查。延迟就是这样工作的-参数会立即计算:
每次执行“defer”语句时,调用的函数值和参数都会像往常一样求值并重新保存,但不会调用实际函数
如果要使用这样的构造,它必须位于闭包中,例如:
defer func() {
erh.Check(rows.Close())
}()
这样在defer
使用哪个数据库时就没有要计算的参数了?我使用的是mysql数据库@thehippowh,您认为问题与crross编译有关吗?它在什么条件下工作?当从Linux编译并在同一台机器上运行时,它是否工作?@mgagnon当我在本地windows机器上运行测试文件时,一切正常,当我为Linux编译并在服务器上运行时,它停止工作。但是,在代码中降低延迟会使代码重新工作。好的,很高兴知道。因此,在linux上运行与在windows上运行相比,问题更多的是交叉编译与本机编译。没有错误。检查行为是否相同,在go 1.9代码中,我不确定我是否理解。根据你的帖子,“当我把延迟放在rows.Next下时,rows.Next代码被执行了”,这与上面的问题一致。我的意思是,当它是defer rows.Close()时,它也不起作用,即使当to代码是用go 1.9编写的时候,它起作用了。你现在正在使用不同版本的go吗?据我所知,没有任何变化会产生任何影响。如果你有不同代码的问题,考虑更新你的问题或者打开一个新的问题。