Как я могу преобразовать структуру с типом данных байтового среза в байты? - PullRequest
0 голосов
/ 25 февраля 2020

Мне нужно отправить данные структуры с типом данных байтового среза во время обмена сокетами.

type A struct {
    header []byte
    body   []byte
}

Поэтому я написал следующий исходный код для преобразования структуры в байты.

var a A
a.header = byte slice data...
a.body   = byte slice data...
buf := new(bytes.Buffer)
binary.Write(buf, binary.BigEndian, a)

Тем не менее, я получаю сообщение об ошибке с функцией binary.Write, показывающей следующую ошибку:

binary.Write: invalid type main.A

Я обнаружил, что исправленные массивы решают проблему. Но так как длина данных постоянно меняется, я должен использовать срез, а не фиксированный массив.

Есть ли способ решить эту проблему?

1 Ответ

0 голосов
/ 25 февраля 2020

Если вы напишите переменную длину байтового среза, другой конец не будет знать, сколько байтов ему нужно прочитать. Вы также должны сообщить длину.

Таким образом, один из способов отправки байтового среза - сначала записать длину (количество байтов), используя тип фиксированного размера, например, int32 или int64. Затем просто напишите байтовый фрагмент.

Например:

var w io.Writer // This represents your connection
var a A

if err := binary.Write(w, binary.LittleEndian, int32(len(a.header))); err != nil {
    // Handle error
}
if _, err := w.Write(a.header); err != nil {
    // Handle error
}

Вы можете использовать тот же лог c для отправки a.body.

С другой стороны наконец, вот как вы могли бы это прочитать:

var r io.Reader // This represents your connection
var a A

var size int32
if err := binary.Read(r, binary.LittleEndian, &size); err != nil {
    // Handle error
}
a.header = make([]byte, size)
if _, err := io.ReadFull(r, a.header); err != nil {
    // Handle error
}

Попробуйте рабочий пример на Go Площадке .

Если вам нужно перенести более сложные структуры рассмотрите возможность использования encoding/gob, который легко обрабатывает отправку фрагментов. Для примера и некоторых идей см. Эффективная Go сериализация структуры на диск .

...