2016-02-18 51 views
3

我刚刚在使用protobuf进行Go编程时跳入内存中,而且我正需要验证结构中的数据。我发现govalidator,这似乎做我需要的完美的工作。它验证基于现场的标签结构,像在proto消息中声明一个字段标记

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代码中看到的东西,编译器总是给这些字段添加标签,但是我能够“偷偷”找到我需要的代码吗?此外,我会想象解组可能是一种可能的解决方案,但对于我来说,解组只是将字段值复制到具有必要字段标签的等价结构,似乎效率不高。

+0

不确定'有效:'alpha,需要“',但它应该是'lastName'和'firstName'的重复吗? – RickyA

+1

对于消息传输(protobuf)和内部数据处理有不同的结构是一种相当常见的模式。有时你会使用一个(通常是消息传递),但正如你所看到的,当你想从内部结构中获取不同的东西时会遇到麻烦。我的建议:为内部目的和复制制作不同的内容。 – RickyA

+0

@RickyA是的,它应该是重复的 - 这些是govalidator使用的验证规则。第二部分 - 这正是我目前所做的:-)谢谢 – Havelock

回答

2

具有相同的数据封装结构和来自客户端的输入只是纯粹的巧合。由于不仅在评论中提出了建议,而且还有一些经验丰富(比我)更有经验的同事用我刚刚绘制的protobuf(在这种情况下为1:1)从proto生成的结构到数据我已经定义了封装结构。