遍历字段名称的结构后,通过括号表示法使用括号中的变量访问值

时间:2018-11-29 17:28:04

标签: go

我有2个JSON文件,一个包含用户,另一个包含电子邮件模板

我正在遍历电子邮件模板中的代码,当有键作为值时,如下所示:

"keyToFind": "Username"

然后我想在另一个JSON文件中获取Username的值:

"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结构中的字段;其中获取了KeyToFind类型的模板JSON文件中的emailElement,它与struct中的字段名称相同;在用户中查找KeyToFind

我可以用Python做到这一点

如何重写第4行以在Go中工作? ->用户[FieldName]

我得到的错误是:

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

但是,如果我再次在第4行中写上这样的话:

user.Username

它可以正常工作,但这显然仅适用于用户名,它们可以是KeyToFind中值的密码或组

以下是JSON文件:

电子邮件模板:

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

我想获取KeyToFind的值并在User文件中搜索属性,然后从该属性返回值

用户文件:

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

1 个答案:

答案 0 :(得分:0)

我是通过将User结构转换为地图来获得的,一旦成为地图,您就可以使用括号符号并在其中加上点符号

在我的上下文中,然后我不得不转换为字符串以传递到缓冲区需要的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"