Что такое oneof в Protobuf?
oneof
в Protobuf позволяет включать несколько типов данных в одно поле, но в один момент времени будет иметь значение только один из этих типов. Это полезно, когда нужно моделировать поле, которое может принимать разные типы данных, но не одновременно.
Основная идея oneof
:
- Одно поле в сообщении может содержать только одно значение из нескольких возможных типов.
- Это сэкономит память, потому что Protobuf будет хранить только одно значение из множества вариантов.
Пример использования oneof
Пример схемы Protobuf с oneof
:
1 2 3 4 5 6 7 8 9 |
syntax = "proto3"; message Response { oneof result { string message = 1; // Сообщение об успехе int32 error_code = 2; // Код ошибки } } |
result
, которое может либо содержать message
(строку), либо error_code
(целое число). Но не оба одновременно.
Как это работает?
Пример данных (json-like)
Допустим, мы создаём сообщение с message
, которое обозначает успешный ответ:
1 2 3 4 5 6 |
{ "result": { "message": "Success" } } |
Или создаём сообщение с error_code
, если произошла ошибка:
1 2 3 4 5 6 |
{ "result": { "error_code": 404 } } |
Пример сгенерированного Go-кода для oneof
:
После компиляции .proto
файла с oneof
, Protobuf создаст Go-структуру с методами для работы с этим полем. Пример сгенерированного кода: