Как использовать [] байт в качестве буфера в реестре. GetValue? - PullRequest
0 голосов
/ 07 ноября 2019

Документация в пакете реестра для GetValue() гласит:

GetValue извлекает тип и данные для указанного значения, связанного с открытым ключом k. Он заполняет буфер buf и возвращает количество найденных байтов n. Если buf слишком мал, чтобы соответствовать сохраненному значению, он возвращает ошибку ErrShortBuffer вместе с требуемым размером буфера n. Если буфер не предоставлен, он возвращает истину и фактический размер буфера n. Если буфер не предоставлен, GetValue возвращает только тип значения. Если значение не существует, возвращается ошибка ErrNotExist.

GetValue - функция низкого уровня. Если тип значения известен , используйте вместо него соответствующую функцию Get * Value. "

В моем случае я не знаю тип значения ключа реестра. Однако мне нужно толькодля вывода значения в виде строки. GetValue() принимает имя значения и «буфер», но буфер имеет тип байта []. Он не передается по ссылке, поэтому я не могу просто создать var buf []byte, передать егои читать его. Я не могу передать это с помощью &buf (type *[]byte). Я не могу использовать byte.Buffer (также несоответствие типов). Я чувствую, что что-то очень простое, что мне не хватает.

Код:

var buf []byte //????
_, _, e := myKey.GetValue(valuename, buf)
if e != nil {
    panic(e)
}
fmt.Printf("Value: %s\n", string(buf)) // Prints blank

1 Ответ

0 голосов
/ 07 ноября 2019

Полагаю, API-интерфейс реестра, о котором вы упомянули, является реестром Windows. Чтобы использовать API-интерфейсы такого типа, вы должны сделать предположение о размере вывода, который вы ожидаете от вызова:

buf:=make([]byte,1024)
typ, n, e := myKey.GetValue(valuename, buf)
if e==ErrShortBuffer {
   // Go back, try with a larger buffer size
   buf=make([]byte,n)
   typ, n, e = myKey.GetValue(valuename, buf)
}
...