Доступ к значениям через скобочные обозначения с переменной в скобках после прохождения через структуру для имен полей - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть 2 JSON-файла, один из которых содержит пользователей, а другой - шаблоны электронной почты

Я перебираю код в шаблонах электронной почты, и когда в качестве значения используется ключ, например:

"keyToFind": "Username"

Затем я хочу получить значение для Username в другом файле JSON:

"Username": "ssmith"

KeyToFind может быть несколькими разными вещами, такими как Password или Group, и я хочу избежать написанияКонкретный оператор if

Я пытаюсь сделать это в своем цикле, но похоже, что я не могу использовать переменную в скобочных обозначениях

for _, emailElements := range emailTemplates.EmailSpecification {
                for _, fieldName := range structs.Names(&User{}) {
                    if emailElements.KeyToFind == fieldName {
                        EmailBody.WriteString(user[fieldName])
                    }
                }

То, что пытается сделать выше, этоцикл по элементам в шаблоне электронной почты, а затем по полям в структуре Users;где получен emailElement в шаблонном JSON-файле типа KeyToFind, и он совпадает с именем поля в структуре;найдите пользовательское значение для KeyToFind

Я мог бы сделать это в Python без проблем

Как я могу переписать строку 4 для работы в Go?-> user [FieldName]

Я получаю ошибку:

user[fieldName] (type User does not support indexing)

Но если я снова напишу строку 4 в это:

user.Username

Это будет работать нормально, но это, очевидно, только для имен пользователей, это может быть пароль или группа для значения в KeyToFind

Вот файлы JSON:

Шаблон электронной почты:

    "emailName": "customer",
    "emailSpecification": [
        {
            "emailSubject": "Hi"
        },
        {
            "text": "Username: "
        },
        {
            "keyToFind": "Username"
        }
]

Я хочу получить значение KeyToFind, выполнить поиск свойств в файле пользователя и вернуть значение из этого свойства

Файл пользователя:

[
{
    "UserType": "customer",
    "Username": "ssmith",
    "Password": "sophie"
}
]

1 Ответ

0 голосов
/ 29 ноября 2018

Я получил это путем преобразования пользовательской структуры в карту, когда это карта, вы можете использовать скобочную нотацию с точечной нотацией внутри

В моем контексте мне пришлось преобразоватьв строку для передачи в функцию WriteString, которой необходим буфер

Вот окончательная версия:

for _, emailElements := range emailTemplates.EmailSpecification {
                for _, fieldName := range structs.Names(&User{}) {
                    if emailElements.KeyToFind == fieldName {
                        EmailBody.WriteString(structs.Map(user)[emailElements.KeyToFind].(string))
                    }
                }
}

Используется пакет:

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