Если вы напишите переменную длину байтового среза, другой конец не будет знать, сколько байтов ему нужно прочитать. Вы также должны сообщить длину.
Таким образом, один из способов отправки байтового среза - сначала записать длину (количество байтов), используя тип фиксированного размера, например, 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 сериализация структуры на диск .