Я осуществляю взаимодействие клиент-сервер с помощью пакетов, определенных пользователем.
Я использую Go net.conn
. Он может набирать схемы tcp / unix, что очень удобно. Я использую protocol buffer
для определения своих сообщений.
Я определил пакет, который содержит length
и buffer
type Packet struct {
length uint32
buffer []byte
}
Функция API выглядит следующим образом:
func(api *API) Send(m *proto.Message) error
func(api *API) Receive(p *Packet) error
Возьмем функцию send
в качестве примера, она принимает сообщение protobuf, преобразует его в Packet
. И напиши это в net.conn
.
Вот упрощенная версия функции отправки:
func(api *API) Send(m *proto.Message) error {
bytes, err := proto.Marshal(m)
if err != nil {
return err
}
buffer := api.packet[:length]
copy(buffer, bytes)
_, err := api.conn.Write(buffer)
if err != nil {
return err
}
return nil
}
Я копировал bytes
в buffer
. Поскольку API буфера протокола Go предоставляет только
func Marshal(pb Message) ([]byte, error)
В буфере протокола C ++ это обеспечивает
bool SerializeToArray(void * data, int size) const
, который сериализует сообщение и сохраняет его в заданном байтовом массиве.
Но я не могу найти то же самое в API буфера протокола Go.
Есть ли способ избежать копирования, если я хочу напрямую сохранить сериализованный результат в заданном байтовом массиве?