2016-02-18 37 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生成的結構到數據我已經定義了封裝結構。