Разобрать и проверить строку "key1: value1; key2: value2" для эффективной структуры Go? - PullRequest
0 голосов
/ 30 июня 2018

У меня есть строка типа «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.

И в другом сенарио я могу определить другую структуру CustomStruct2 для строки типа key3:value3; key4:value4;

Как я могу эффективно и элегантно архивировать такого рода требования?

1 Ответ

0 голосов
/ 30 июня 2018

Я предполагаю, что вы можете анализировать данные в интерфейсе map [string] {}.

Используйте пакет отражает для установки полей. Вот основная функция:

// 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))
        }
    }
}

В этом коде предполагается, что значения в карте данных можно назначить соответствующему полю в структуре и что первый аргумент является указателем на структуру. Код будет паниковать, если эти предположения не соответствуют действительности. Вы можете защитить от этого, проверив типы и присваиваемость, используя пакет отражения.

пример детской площадки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...