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

Debugging 从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() {

将我的代码从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())

有人能确认这是一个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吗?据我所知,没有任何变化会产生任何影响。如果你有不同代码的问题,考虑更新你的问题或者打开一个新的问题。