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

由于想给一个结构体的部分成员赋值,但是有不知道具体名字,故将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
}

 
时间: 2024-08-01 16:40:29

golang-利用反射给结构体赋值的相关文章

C语言中结构体赋值问题的讨论(转载)

今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言中结构体赋值的问题吧: 结构体直接赋值的实现 下面是一个实例: #include <stdio.h> struct Foo { char a; int b; double c; }foo1, foo2; //define two structs with three different field

C#中使用反射获取结构体实例

原文:C#中使用反射获取结构体实例 一般用反射获取类对象的实例比较简单,只要类有一个无参构造函数或没有显示声明带参的构造函数即可使用如下代码 static void Main(string[] args) { Type type = typeof(MyObject); object obj = type.GetConstructor(Type.EmptyTypes).Invoke(null); Console.WriteLine(obj); } class MyObject { } 之前我一直没

结构体赋值

#include <stdio.h> struct student{ int ID; char name[48]; int age; }; int main(){ struct student s1 = { 1, "lifei", 24 }; struct student s2; s2 = s1; //s2.name = "letben";//错误 1 error C2106: “=”: 左操作数必须为左值 f:\tryc++\结构体的赋值\结构体的赋值

在Golang里如何实现结构体成员指针到结构体自身指针的转换

原文地址:http://goworldgs.com/?p=37 在C语言中有一个经典的宏定义,可以将结构体struct内部的某个成员的指针转化为结构体自身的指针.下面是一个例子,通过FIELD_OFFSET宏计算结构体内一个字段的偏移,函数getT可以从一个F*的指针获得对应的T*对象. struct F { int c; int d; } struct T{ int a; int b; struct F f; } #define FIELD_OFFSET(type, field) ((int)

读取配置文件,利用反射给类属性赋值,

背景:项目中用的全局变量,一般通过形如 pubic static final String ABC="abc";然后在项目中用类.属性名的方式调用. 如果变量的值并不固定.比如不同客户定义的值不同,就不能用final修饰.只能用public static String ABC;方式来声明,也可加默认初始值: 这个时候我们就需要一个初始化方法(init())来对变量进行初始化赋值,让其变得有意义. 因为值需要从配置文件中读取,传统方法,可能是根据属性的set方法一个一个设置.假如有10个

golang 兼容不同json结构体解析实践

线上服务器,同一个web接口有时需要兼容不同版本的结构体.这种情况思路是使用interface{}接收任意类型数据,结合reflect包处理. 如下,http接口调用者会传入不同的json结构数据(单体结构或切片结构): type ReqStu struct { XXX struct { //XXX结构为单体 AAA string `json:"aaa"` BBB string `json:"bbb"` CCC string `json:"ccc"

读取bin文件,并且按结构体赋值打印

目标:读取一个bin文件,并且将bin文件中的数据,按字节对齐赋值给结构体,并且打印出结构体的内容 目前思路是简单的先将bin文件数据一次性读到一个数组中,再将数组强制转换为结构体 char buff[256] FILE *fp; fp = NULL; fp = fopen(argv[1], "rb"); if (NULL == fp) { printf( "The file was not opened\n"); return; } fread(buff, 1,

golang 碎片整理之 结构体

什么是结构体? 结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础.结构体的概念在软件工程上的旧术语是ADT(抽象数据类型: Abstract Date type).在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样.因为在Go语言中没有类的概念,所以在go中结构体有着很重要的地位. 如何定义一个结构体 type Coordinate struct {

换个语言学一下 Golang (9)——结构体和接口

基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,Go提供的结构体就是把使用各种数据类型定义的不同变量组合起来的高级数据类型.闲话不多说,看例子: type Rect struct { width float64 length float64 } 上面我们定义了一个矩形结构体,首先是关键是type表示要定义一个新的数据类型了,然后是新的数据类型名称R