Если вы заранее знаете все возможные типы, использование oneof
будет путем к go здесь, как вы описали.
Основной причиной использования буферов протокола является определение схемы . С помощью определения схемы вы получаете типы, генерацию кода, безопасное развитие схемы, эффективное кодирование и т. Д. c. С подходом oneof
вы получите эти преимущества для вложенной полезной нагрузки.
Я бы не рекомендовал использовать string payload
, поскольку использование строки для фактической полезной нагрузки лишает многих преимуществ использования буферов протокола. Кроме того, даже если вам не нужен оператор switch для десериализации полезной нагрузки, вам, вероятно, в какой-то момент понадобится оператор switch, чтобы использовать данные (если вы просто не перенаправляете данные в какую-то другую систему).
Альтернативный вариант
Если вы заранее не знаете возможные типы, вы можете использовать тип Any
для вставки произвольного сообщения буфера протокола в ваше сообщение.
import "google/protobuf/any.proto";
message MyMessage {
google.protobuf.Any payload = 1;
}
Сообщение Any
- это в основном ваш подход string payload
, но с использованием байтов вместо строки.
message Any {
string type_url = 1;
bytes value = 2;
}
Использование Any
имеет следующие преимущества перед string payload
:
- Поощряет использование буфера протокола для определения динамики c содержимое полезной нагрузки
- Инструменты в библиотеке буфера протокола для каждого языка для упаковки и распаковки сообщений буфера протокола в тип
Any
Для получения дополнительной информации о Any
см .: