Как отдавать сообщения различных типов?

Ссылка скопирована
Go
0 ответов
type Packet struct { Type uint8 Timestamp uint32 Data []byte } func ReadPacket(packet *Packet) error { // somehow read data into the packet return nil } type Message interface {} type VideoMessage struct { Timestamp uint32 Data []byte } type CallMessage struct { CallID uint32 Procedure string } func ReadMessage() (Message, error) { var packet Packet if err := ReadPacket(&packet); err != nil { return err } switch packet.Type { case PacketVideo: return &VideoMessage{ Timestamp: packet.Timestamp, Data: packet.Data, }, nil case PacketUserData: callID, procedure := getCallInfo(&packet) return &UserDataMessage{ CallID: callID, Procedure: procedure, }, nil default: return nil, ErrInvalidPacketType } }

Сейчас ситуация такая: проблема в том, что я постоянно выделяю память для сообщений.
По вводным: есть идея реализовать union тип по примеру C, но тогда нарушится безопасность типов.
Сейчас ситуация такая: либо можно попробовать использовать какой-то пул памяти и выделять место под сообщения там, но я не уверен насчет этого решения
Либо что-то такое

func ReadCallMessage(packet *Packet, mesg *CallMessage) { // read packet into mesg } func main() { for { var packet Packet if err := ReadPacket(&packet); err != nil { continue } switch packet.Type { case PacketCall: mesg := CallMessage{} ReadCallMessage(&packet, &mesg) } } }

Какие варианты решения стоит рассмотреть?

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно