簡體   English   中英

解析並驗證“ key1:value1; key2:value2”字符串有效地進行結構化?

[英]Parse and validate “key1:value1; key2:value2” string to Go struct efficiently?

我有一個像字符串一樣的“ key1:value1; key2:value2”(字符串由key:value模式; )。

現在,我想將此字符串解析為Go結構:

type CustomStruct struct {
   KeyName1 string `name:"key1" somevalidation:"xxx"`
   KeyName2 int    `name:"key2" somevalidation:"yyy"`
}

在上面的示例中,struct標記定義了字符串中鍵的名稱,並且可以為其相應的值提供一些驗證(如果驗證失敗,則可以設置默認值)。 例如, KeyName2是一個int值,所以我希望somevalidation可以檢查KeyName2是否滿足,例如,大於30且小於等於100。

在另一個環境中,我可以為key3:value3; key4:value4;這樣的字符串定義另一個結構CustomStruct2 key3:value3; key4:value4; key3:value3; key4:value4;

我怎樣才能有效而優雅地歸檔這種要求?

我假設您可以將數據解析到map [string] interface {}。

使用反射包來設置字段。 基本功能如下:

// set sets fields in struct pointed to by pv to values in data.
func set(pv interface{}, data map[string]interface{}) {
    // pv is assumed to be pointer to a struct
    s := reflect.ValueOf(pv).Elem()

    // Loop through fields
    t := s.Type()
    for i := 0; i < t.NumField(); i++ {

        // Set field if there's a data value for the field.
        f := t.Field(i)
        if d, ok := data[f.Tag.Get("name")]; ok {
            s.Field(i).Set(reflect.ValueOf(d))
        }
    }
}

此代碼假定數據映射中的值可分配給結構中的相應字段,並且第一個參數是指向結構的指針。 如果這些假設不成立,則代碼將感到恐慌。 您可以通過使用反射包檢查類型和可分配性來防止此情況。

游樂場的例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM