Нулевое значение буфера протокола для целого числа - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть структура Go, которую мы используем в настоящее время в нашем restful API, который выглядит следующим образом:

type Req struct {
  Amount *int
}

Я использую указатель здесь, потому что если значение Amount равно nil, это означает Amount не был заполнен, если Сумма не равна нулю, но равна нулю, это означает, что поле заполнено, но значение равно нулю.

Когда мы начали переходить на протофайлы и хотим использовать его, как, основной API получает запрос как HTTP API и отправляет его следующему сервису через gRPC с тем же профилем, с которым я столкнулся, проблемаproto3 не может сгенерировать указатель для суммы.Это хорошо, потому что буферы протокола предназначены для отправки данных между отдельными системами, но как я могу решить проблему, описанную выше, потому что, если я получаю запрос, я не могу решить, что сумма равна нулю или просто равна нулю.

1 Ответ

0 голосов
/ 04 февраля 2019

proto3 не различает ноль и отсутствует;понятия по умолчанию и неявные против явных значений исчезли:

  • значение по умолчанию всегда равно нулю (или ложь и т. д.)
  • , если значение равно нулю, оно не отправляется;в противном случае это

То, что вам нужно, более возможно с proto2.В качестве альтернативы просто добавьте отдельное поле , чтобы указать, что у вас есть значение для чего-либо:

message Req {
    int amount = 1;
    bool amountHasValue = 2;
}

Или используйте вложенное вспомогательное сообщение, например

message Foo {
    Bar bar = 1;
}
message Bar {
    int amount = 1;
}

(поэтому; без значения вы просто отправляете Foo; со значением вы отправляете Foo с Bar, и чем бы это ни было amount: оно есть)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...