7

Golang 用interface{} map 给struct赋值

 3 years ago
source link: https://studygolang.com/articles/18254?fr=sidebar
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Golang 用interface{} map 给struct赋值

siskinc · 2019-02-16 08:34:43 · 2841 次点击 · 预计阅读时间 1 分钟 · 大约8小时之前 开始浏览    
这是一个创建于 2019-02-16 08:34:43 的文章,其中的信息可能已经有所发展或是发生改变。

在有些场景下,我们需要用一个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
}

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

280

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

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

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK