Golang 用interface{} map 给struct赋值

siskinc · · 6984 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在有些场景下,我们需要用一个map[string]interface{}, map的key是struct中的一个tag的值, value是需要赋值的值,我们可以使用reflect包来进行操作。

  1. 我们需要struct的指针,只有指针我们才能在函数中改变struct的值
  2. 根据指针获取struct的实例,Type
  3. 依次遍历struct的域,取出域中的tag和map中的key进行比较,然后比较域的Type和map中value的Type,如果相等就可以进行赋值了
    贴代码:
func SetValueByTag(result interface{}, tagName string, tagMap map[string]interface{}) error {
    t := reflect.TypeOf(result)
    if t.Name() != "" {
        return fmt.Errorf("result have to be a point")
    }
    v := reflect.ValueOf(result).Elem()
    t = v.Type()
    fieldNum := v.NumField()
    for i := 0; i < fieldNum; i++ {
        fieldInfo := t.Field(i)
        tag := fieldInfo.Tag.Get(tagName)
        if tag == "" {
            continue
        }
        if value, ok := tagMap[tag]; ok {
            if reflect.ValueOf(value).Type() == v.FieldByName(fieldInfo.Name).Type() {
                v.FieldByName(fieldInfo.Name).Set(reflect.ValueOf(value))
            }
        }
    }
    return nil
}

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:siskinc

查看原文:Golang 用interface{} map 给struct赋值

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6984 次点击  
加入收藏 微博
上一篇:包相关
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传