IT заметки по программированию
IT заметки по программированию
IT заметки по программированию
IT заметки по программированию

Что такое oneof в Protobuf?

oneof в Protobuf позволяет включать несколько типов данных в одно поле, но в один момент времени будет иметь значение только один из этих типов. Это полезно, когда нужно моделировать поле, которое может принимать разные типы данных, но не одновременно.


Основная идея oneof:

  • Одно поле в сообщении может содержать только одно значение из нескольких возможных типов.
  • Это сэкономит память, потому что Protobuf будет хранить только одно значение из множества вариантов.

Пример использования oneof

Пример схемы Protobuf с oneof:

🔹 Здесь у нас есть поле result, которое может либо содержать message (строку), либо error_code (целое число). Но не оба одновременно.


Как это работает?

Пример данных (json-like)

Допустим, мы создаём сообщение с message, которое обозначает успешный ответ:

Или создаём сообщение с error_code, если произошла ошибка:

Пример сгенерированного Go-кода для oneof:

После компиляции .proto файла с oneof, Protobuf создаст Go-структуру с методами для работы с этим полем. Пример сгенерированного кода:

Как работает oneof в Go?

  • При сериализации и десериализации внутри поля Result будет находиться только один из типов данных (либо Message, либо ErrorCode).
  • В Go сгенерирован код будет использовать встраиваемые типы (Response_Message, Response_ErrorCode), чтобы явно указать, какой тип был установлен.
  • Когда мы десериализуем данные, нужно проверить с помощью type assertion, какой тип в данный момент находится в поле.

Особенности работы с oneof:

  1. Только один тип в поле: Когда используешь oneof, Protobuf не позволяет одновременно хранить несколько значений в одном поле. То есть, если в одном пакете данных содержится message, в этот момент нельзя поставить значение для error_code и наоборот.
  2. Экономия памяти: Поскольку только одно значение из oneof сериализуется и хранится в данных, это экономит память, когда есть поля с возможными большими типами данных.
  3. Простота в использовании: Для потребителей сообщения (например, клиентов) легко использовать switch или другие проверки типа, чтобы работать с конкретным значением.

Когда использовать oneof?

  • Когда одно поле может быть разного типа. Например, ответ может быть либо успехом, либо ошибкой, но не обоими одновременно.
  • Когда экономия памяти важна и вам нужно обрабатывать различные типы данных в одном сообщении.
  • Когда есть несколько типов данных, которые могут быть заменены в определённых условиях, например, разные виды сообщений, ошибки или ответы от разных типов клиентов.

Итог:
oneof — это удобный инструмент для работы с полями, которые могут принимать разные значения, но только одно в конкретный момент времени. Это помогает создавать более гибкие и экономичные схемы сообщений в Protobuf!

Добавить комментарий

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