170 похожих чатов

Коллеги, есть обращение к реестру, на некоторых машинах с этим

кодом происходит ошибка чтения ключа "unable to read geo registry key:", хотя defer должен закрыть в конце функции...
было:
func (g *Geo) isQueryAllowed(key registry.Key) (bool, error) {
store, err := registry.OpenKey(key, geoRegistryPath, registry.QUERY_VALUE|registry.WOW64_64KEY)
if err != nil {
return false, fmt.Errorf("unable to open geo registry path: %v", err)
}
defer g.closeRegistryKey(store)

val, _, err := store.GetStringValue(geoRegistryKey)
if err != nil {
return false, fmt.Errorf("unable to read geo registry key: %v", err)
}
if strings.EqualFold(val, "Allow") {
return true, nil
}
return false, nil
}

стало:
func (g *Geo) isQueryAllowed(key registry.Key) (bool, error) {
store, err := registry.OpenKey(key, geoRegistryPath, registry.QUERY_VALUE|registry.WOW64_64KEY)
if err != nil {
return false, fmt.Errorf("unable to open geo registry path: %v", err)
}
defer store.Close()
val, _, err := store.GetStringValue(geoRegistryKey)
if err != nil {
return false, fmt.Errorf("unable to read geo registry key: %v", err)
}
if strings.EqualFold(val, "Allow") {
return true, nil
}
return false, nil
}
и теперь работает все ок. Но почему так?

3 ответов

9 просмотров

так понял, вместо всего текста можно было бы написать "в чем разница между defer g.closeRegistryKey(store) и defer store.Close()" аргументы для конструкции defer высчитываются на момент вызова defer. те вызов g.closeRegistryKey(store) будет работать со store из самого начала функции. исправить это можно также вот отказавшись от аргумента defer: defer func(){ g.closeRegistryKey(store) }()

Pavel-Tsvetkov Автор вопроса
Elmanov Anton
так понял, вместо всего текста можно было бы напис...

Антон спасибо, я был уверен что любой defer работает в конце функции...

Pavel Tsvetkov
Антон спасибо, я был уверен что любой defer работа...

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

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта