#go #protocol-buffers #grpc
#Вперед #буферы протокола #grpc
Вопрос:
У меня есть две службы, которые взаимодействуют друг с другом и имеют отдельные протофайлы. Есть пара типов сообщений, общих для этих двух. При попытке тестового запуска я получаю:
2020/08/24 13:40:42 WARNING: proto: file "delivery.proto" has a name
conflict over release.Patient previously from:
"gitlab.com/dhf0820/roirelease/protobufs/relPB" currently from:
"gitlab.com/dhf0820/roi_delivery/protobufs/delPB"
Как вы можете видеть, у них разные имена пакетов relPB и delPB. Пациент используется в обеих службах, и я маршалирую / отменяю маршалирование между ними, чтобы отправить правильное сообщение. Я не уверен, что это правильный путь.
Есть ли лучший способ или что происходит. Кажется, у меня уникальные имена.
Ответ №1:
Похоже, что имена уникальны в сгенерированном домене кода Go, но не в домене protobuf.
Вы действительно можете рассматривать protobuf как свой собственный язык, со своим собственным пакетом и семантикой пространства имен (на практике, аналогично C ). В этом домене фактические имена файлов не имеют значения, только пакет, определенный в файле.
Оба ваших файла, вероятно, имеют package release;
вверху. Это означает, что в мире protobuf release.Patient
определяется дважды. protoc
возможно, все еще удастся случайно сгенерировать рабочий код Go, но это все еще искаженное определение proto. Возможно, вам не повезет так же, если вы попытаетесь использовать то же определение на других языках (например, C ) или если вы попытаетесь использовать библиотеки, которые зависят от проторефлексии. Он также может прерваться, если вы попытаетесь использовать одно из сообщений в качестве поля в другом файле; на что release.Patient
это будет ссылаться?