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

4 просмотра

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

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

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

А чем вам питонисты не угодили?😂
.
79
Язык Си можно выучить за день? По книжке ANSI C на 230 страниц
Vincent Vegan
29
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Dim Dim, [02.07.2024 11:07] DB 0x62 Dim Dim, [02.07.2024 11:07] DB 0x66 Dim Dim, [02.07.2024 11:07] кто пояснит что это?
Dim Dim
14
Ошибка: segmentation fault (core dumped) Код: pastebin.com/BEsNNSSV Сообщение от компилятора: отсутствует ОС: Arch Linux Ядро: x86_64 Linux 6.9.7-arch1-1 Процессор: Intel Cele...
sec
4
Ребят, а за скок можно впарить анон чат с апишкой и веб админкой ?
Eugene Неелов
15
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Кстати, я тут еще с одной темой столкнулся, вот учу я C++, на таком то ресурсе, а остальные постоянно советуют практиковаться, что то писать, проекты, но как писать если вот т...
aaswq1
7
Добрый день, чат. Мне в очередь из других RabbitMQ по shovel валятся метрики в формате текста для Prometheus. Помогите пожалуйста подружить RabbitMQ и Prometheus, чтобы он (...
Aleksey
4
@ahndmn @ayaw0_0 здарова, на чем пишете?
Aiwan \ (•◡•) / _bot
7
Карта сайта