Задать вопрос
@djEban

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

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)
        }
    }
}


Какие ваши идеи?
  • Вопрос задан
  • 163 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Go-разработчик с нуля + нейросети
    9 месяцев
    Далее
  • Академия Эдюсон
    GO-разработчик
    4 месяца
    Далее
  • Яндекс Практикум
    Продвинутый Go-разработчик + инфраструктура и продакшн
    8 месяцев
    Далее
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы