кодом происходит ошибка чтения ключа "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
}
и теперь работает все ок. Но почему так?
так понял, вместо всего текста можно было бы написать "в чем разница между defer g.closeRegistryKey(store) и defer store.Close()" аргументы для конструкции defer высчитываются на момент вызова defer. те вызов g.closeRegistryKey(store) будет работать со store из самого начала функции. исправить это можно также вот отказавшись от аргумента defer: defer func(){ g.closeRegistryKey(store) }()
Антон спасибо, я был уверен что любой defer работает в конце функции...
именно значения аргументов функции, которая вызвана в defer захватываются на момент вызова defer. сам код срабатывает в конце.
Обсуждают сегодня