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 ответов

8 просмотров

так понял, вместо всего текста можно было бы написать "в чем разница между 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. сам код срабатывает в конце.

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

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

#include <stdio.h> #include <stdlib.h> #include <time.h> void mass_first_generate(int mass[5][7]) {     for (int N = 0; N < 5; N++) {         for (int A = 0; A < 7; A++) {   ...
Чувак
6
Всем привет! Решаю 99 OCaml Problems и столкнулся со следующей проблемой (прошу палками не забивать, я OCaml практически не трогал до этого момента): open OUnit2 let create_...
К|/|pи/\/\ 6е3yглbIи
2
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
возможно ли как-то передать в электрон или таури медиа поток с рендера 2д движка? двиг запускается как dll, а дальше надо как-то отправлять рендер кодировать не подходит, зр...
Kyle Nekto
7
https://www.linkedin.com/posts/ugama-benedicta-kelechi-codergirl-103041300_mobiledevelopment-fluttertraining-handsonlearning-activity-7263445699227254784-IdHB?utm_source=share...
CoderGirl
16
Помогите пожалуйста. Делаю систему плагинов. Проблема сейчас в такая: плагины загружаются в основном потоке. FLibHandle := SafeLoadLibrary(FFileName) Но нужно еще выполнить фу...
Илья 🤣
10
Ну вот просто даже давайте вот как. Какой нибудь конкретный кейс, можете в пример привести, где бч работает и приносит прикладную пользу, а не просто что бы было? Не крипту.
Alexander Andreev
22
объясните пожалуйста, почему функция не работает должным образом? вроде должно брать активное окно сравнивать его размер с размером экрана, и если есть совпадение = true прове...
JF
12
лучше скажите, причём тут паскаль?
Alexey Kulakov
36
У меня вопрос попроще, почти нубский: нужно заставить сайт эво 1.4.34 перевести с PHP 7.4 на 8.2. Понятное дело, что дополнения обновить-проверить, а с основной системой как ...
Вячеслав Кузьменко
5
Карта сайта