golang-利用反射给结构体赋值

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

由于想给一个结构体的部分成员赋值,但是有不知道具体名字,故将tag的json名字作为索引,按照json名字来一一赋值


//将结构体里的成员按照json名字来赋值
func SetStructFieldByJsonName(ptr interface{}, fields map[string]interface{}) {
    logger.Debug("fields:", fields)

    v := reflect.ValueOf(ptr).Elem() // the struct variable

    for i := 0; i < v.NumField(); i++ {

        fieldInfo := v.Type().Field(i) // a reflect.StructField
        tag := fieldInfo.Tag           // a reflect.StructTag
        name := tag.Get("json")

        if name == "" {
            name = strings.ToLower(fieldInfo.Name)
        }
        //去掉逗号后面内容 如 `json:"voucher_usage,omitempty"`
        name = strings.Split(name, ",")[0]
        logger.Debug("JSONnAME:", name)

        if value, ok := fields[name]; ok {

            logger.Debug("fieldInfo.Name:", fieldInfo.Name)
            //给结构体赋值
            //保证赋值时数据类型一致
            logger.Debug("类型1:", reflect.ValueOf(value).Type(), "类型2:", v.FieldByName(fieldInfo.Name).Type())
            if reflect.ValueOf(value).Type() == v.FieldByName(fieldInfo.Name).Type() {
                v.FieldByName(fieldInfo.Name).Set(reflect.ValueOf(value))
            }

        }
    }

    return
}

 

 

 


有疑问加站长微信联系

本文来自:博客园

感谢作者:fwdqxl

查看原文:golang-利用反射给结构体赋值

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

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