2016-02-18 1 views
3

Я просто нырнул в программирование Go, используя protobuf, и я нахожусь в точке, где мне нужно проверить данные в структуре. Я нашел govalidator, который, кажется, делает идеальную работу за то, что мне нужно. Он проверки структур на основе тегов поля, что-то вродеОбъявление тега поля в прото-сообщении

type Contact struct { 
    firstName string `valid:"alpha,required"` 
    lastName string `valid:"alpha,required"` 
    email string `valid:"email,required"` 
} 

jdoe := &Contact{ 
    firstName: "John", 
    lastName: "Doe", 
    email: "[email protected]" 
} 

ok, err = govalidator.ValidateStruct(jdoe) 

И мое определение Protobuf будет выглядеть

message Contact { 
    string firstName = 1; 
    string lastName = 2; 
    string email = 3; 
} 

Теперь мой вопрос будет, есть ли способ, чтобы определить поля метки в прото-сообщение. Из того, что я видел в сгенерированном коде go, компилятор все равно добавляет теги в поля, но могу ли я «прокрасть» те, которые мне тоже нужны? Кроме того, я бы предположил, что unmarshalling может быть одним из возможных решений, но мне почему-то кажется неэффективным, чтобы развязать просто для копирования значений полей в эквивалентную структуру, которая будет иметь необходимые теги полей.

+0

Не уверен, какой 'valid:" alpha, required "' does, но предполагается ли это дубликат для 'lastName' и' firstName'? – RickyA

+1

Это довольно распространенный шаблон, который имеет разную структуру для транспортировки сообщений (protobuf) и внутренней обработки данных. Иногда вы избегаете использования одного (обычно сообщения для обмена сообщениями), но, как видите, вы сталкиваетесь с проблемами, когда хотите получить разные вещи из своей внутренней структуры. Мой совет: сделайте другой для внутренних целей и скопируйте. – RickyA

+0

@ RickyA да, предполагается, что он дублируется - это правила проверки 'govalidator'. А для второй части - это именно то, что я делаю в данный момент :-) Спасибо – Havelock

ответ

2

Наличие такой же структуры для инкапсуляции данных и ввода, поступающих от клиента, было просто совпадением. Поскольку это было предложено не только в комментариях, но и со стороны сотрудников, более опытных (чем я) с protobuf, которые я только что сопоставил (1: 1 в данном конкретном случае), поля из структуры, сгенерированной прото-данными структура инкапсуляции, которую я определил.

Смежные вопросы