Выбор ответа Senior gRPC, GraphQL и WebSocket обновлено
Значения по умолчанию в proto3
Вопрос
В proto3 поле int32 discount = 3; (без optional). Сервер вернул сообщение, где скидка 0. Как клиент отличит «скидка 0» от «скидку не прислали»?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Никак: 0 не передаётся по сети и неотличим от пропуска, нужен optional. В proto3 скалярное поле без optional не хранит признак присутствия: 0, пустая строка и false не сериализуются и на клиенте неотличимы от отсутствия.
Варианты ответа
- По флагу
grpc-field-presentв метаданных ответа, сервер ставит его сам - Клиент получит
nullвместо 0, если поле не прислали - Сервер вернёт
INVALID_ARGUMENT, если обязательное поле не заполнено - Никак: 0 не передаётся по сети и неотличим от пропуска, нужен
optionalправильный ответ
Разбор
В proto3 скалярное поле без optional не хранит признак присутствия: 0, пустая строка и false не сериализуются и на клиенте неотличимы от отсутствия. Для явного «не задано» используют optional (снова доступно с protobuf 3.15) или обёртки вроде google.protobuf.Int32Value. Хороший источник багов: «скидку убрали» и «скидку не прислали» обрабатываются одинаково.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.