Выбор ответа Senior gRPC, GraphQL и WebSocket обновлено

Значения по умолчанию в proto3

Вопрос

В proto3 поле int32 discount = 3; (без optional). Сервер вернул сообщение, где скидка 0. Как клиент отличит «скидка 0» от «скидку не прислали»?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Никак: 0 не передаётся по сети и неотличим от пропуска, нужен optional. В proto3 скалярное поле без optional не хранит признак присутствия: 0, пустая строка и false не сериализуются и на клиенте неотличимы от отсутствия.

Варианты ответа

  1. По флагу grpc-field-present в метаданных ответа, сервер ставит его сам
  2. Клиент получит null вместо 0, если поле не прислали
  3. Сервер вернёт INVALID_ARGUMENT, если обязательное поле не заполнено
  4. Никак: 0 не передаётся по сети и неотличим от пропуска, нужен optionalправильный ответ

Разбор

В proto3 скалярное поле без optional не хранит признак присутствия: 0, пустая строка и false не сериализуются и на клиенте неотличимы от отсутствия. Для явного «не задано» используют optional (снова доступно с protobuf 3.15) или обёртки вроде google.protobuf.Int32Value. Хороший источник багов: «скидку убрали» и «скидку не прислали» обрабатываются одинаково.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.