猿问

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

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

有人可以确认这是一个错误,还是我在这里遗漏了什么?


ibeautiful
浏览 99回答 1
1回答

呼如林

我不确定这在 Linux 上如何工作,它不应该。这一行:    defer erh.Check(rows.Close())将rows.Close() 立即执行,保留返回值,然后仅延迟对 的调用erh.Check。这就是 defer 的工作原理——立即评估参数。从文档:每次执行“defer”语句时,调用的函数值和参数都会像往常一样计算并重新保存,但不会调用实际函数。如果你想使用这样的构造,它必须在一个闭包中,比如:defer func() {     erh.Check(rows.Close()) }()所以在 的时候没有要评估的参数defer。
随时随地看视频慕课网APP

相关分类

Go
我要回答