Golang преобразовать строку gob в интерфейс - PullRequest
3 голосов
/ 06 мая 2020

Я делаю программу go, в которой мне нужно записать каплю в файл. Я использовал метод .String () для преобразования капли в строку.

var network bytes.Buffer
encoder := gob.NewEncoder(&network)

_ = encoder.Encode(valueToEncode)

gobString := network.String()

затем я запишу каплю в файл, а позже я извлечу ее и отправлю в эту программу:

var filebytes = []byte(file)  //i think that these two lines are the issue
network := bytes.NewBuffer(filebytes)

decoder := gob.NewDecoder(network)

var decoded interface{}

_ := decoder.Decode(&decoded)

но когда я запускаю это, это дает мне эту ошибку:

gob: закодированное целое число без знака вне диапазона

Я думаю, что проблема в с первыми двумя строками программы декодера. Итак, что я должен добавить, чтобы правильно декодировать каплю?

РЕДАКТИРОВАТЬ: Мне нужен метод .UnString () для gobString. Как я могу этого добиться?

1 Ответ

2 голосов
/ 06 мая 2020

encoding/gob генерирует двоичные данные из Go значений. Результат не для текстового представления, поэтому вы не должны рассматривать его как string, а как серию байтов, например []byte.

Тем не менее, не используйте Buffer.String() , а скорее Buffer.Bytes(), если вы должны получить закодированные данные.

Вот пример кодирования и декодирования значения string с использованием encoding/gob:

// ENCODE
var network bytes.Buffer
encoder := gob.NewEncoder(&network)

valueToEncode := "Hello, 世界"
if err := encoder.Encode(valueToEncode); err != nil {
    panic(err)
}

gobData := network.Bytes() // Save / serialize this byte slice

// DECODE
network2 := bytes.NewBuffer(gobData)
decoder := gob.NewDecoder(network2)

var decoded string
if err := decoder.Decode(&decoded); err != nil {
    panic(err)
}
fmt.PrintTln(decoded)

Вывод (попробуйте на Go Playground ):

Hello, 世界

Также обратите внимание, что если вы собираетесь записать закодированные данные в сетевое соединение или файл, вы не нужно bytes.Buffer, вы можете напрямую кодировать их. Если вы должны использовать bytes.Buffer, вы также можете использовать его метод Buffer.WriteTo() для записи его содержимого в io.Writer (например, файл или сетевое соединение).

...