Ошибка при кросс-компиляции из Windows в Linux? - PullRequest
0 голосов
/ 17 января 2019

При кросс-компиляции моего кода из 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 Ответ

0 голосов
/ 17 января 2019

Я не уверен, как это может работать в Linux, не должно. Эта строка:

    defer erh.Check(rows.Close())    

Выполнит rows.Close() немедленно , удерживает возвращаемое значение, затем откладывает только вызов erh.Check. Вот как работает отсрочка - аргументы оцениваются сразу. Из документов :

Каждый раз, когда выполняется оператор defer, значение функции и параметры для вызова оцениваются как обычно и сохраняются заново, но фактическая функция не вызывается.

Если вы хотите использовать такую ​​конструкцию, она должна быть в замыкании, что-то вроде:

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

Чтобы не было аргументов для оценки во время defer.

...