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)
}
}
}
Какие ваши идеи?