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


1.通过tag反射
//将结构体里的成员按照json名字来赋值
func SetStructFieldByJsonName(ptr interface{}, fields map[string]interface{}) {
logger.Debug("fields:", fields) v := reflect.ValueOf(ptr).Elem() // the struct variable for i := ; 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, ",")[]
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
}

2.通过结构体字段名称进行反射

// 通过反射,对user进行赋值
type user struct{
name string
age int
feature map[string]interface{}
} func main() {
var u interface{}
u=new(user)
value:=reflect.ValueOf(u)
if value.Kind()==reflect.Ptr{
elem:=value.Elem()
name:=elem.FieldByName("name")
if name.Kind()==reflect.String{
*(*string)(unsafe.Pointer(name.Addr().Pointer())) = "fangwendong"
} age:=elem.FieldByName("age")
if age.Kind()==reflect.Int{
*(*int)(unsafe.Pointer(age.Addr().Pointer())) =24
} feature:=elem.FieldByName("feature")
if feature.Kind()==reflect.Map{
*(*map[string]interface{})(unsafe.Pointer(feature.Addr().Pointer())) =map[string]interface{}{
"爱好":"篮球",
"体重":60,
"视力":5.2,
}
} } fmt.Println(u)
}
 

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

  1. Golang通过反射获取结构体的标签

    Golang通过反射获取结构体的标签 例子: package main import ( "fmt" "reflect" ) type resume struc ...

  2. golang中的反射解析结构体标签tag

    package main import ( "fmt" "reflect" ) type resume struct { // 反射解析结构体标签tag Nam ...

  3. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  4. c语言结构体赋值问题

    对于结构体赋值问题: static psl{ int a; char ch; }; 我过去一般会对结构体这样赋值: static psl pslname = { , 'b', }; 记住有一点,‘b’ ...

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

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

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

    一般用反射获取类对象的实例比较简单,只要类有一个无参构造函数或没有显示声明带参的构造函数即可使用如下代码 static void Main(string[] args) { Type type = t ...

  7. linux kernel 结构体赋值方法{转载}

    原文地址: http://www.chineselinuxuniversity.net/articles/48226.shtml 这几天看Linux的内核源码,突然看到init_pid_ns这个结构体 ...

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

    线上服务器,同一个web接口有时需要兼容不同版本的结构体.这种情况思路是使用interface{}接收任意类型数据,结合reflect包处理. 如下,http接口调用者会传入不同的json结构数据(单 ...

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

    目标:读取一个bin文件,并且将bin文件中的数据,按字节对齐赋值给结构体,并且打印出结构体的内容 目前思路是简单的先将bin文件数据一次性读到一个数组中,再将数组强制转换为结构体 ] FILE *f ...

随机推荐

  1. Netty Nio启动全流程

    Netty Nio启动全流程 1. 各组件之间的关系 说明:EventLoopGroup类似线程池,EventLoop为单线程,每个EventLoop关联一个Nio Selector,用于注册Chan ...

  2. HDU1426 Sudoku Killer(DFS暴力) 2016-07-24 14:56 65人阅读 评论(0) 收藏

    Sudoku Killer Problem Description 自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视. 据说,在2008北京奥运会上,会 ...

  3. delphi 安卓程序如何读取外部配置文件

    1)编辑一个config.txt文件,填写配置系统. 2)有外部加载文件时,安卓发布需要另行指定文件发布目录位置 比如加载config.txt需要在 首先利用Project->Deploymen ...

  4. Android-ByteUtil工具类

    Byte处理转换相关的工具类: public class ByteUtil { private ByteUtil(){} /** * 把byte[] 转成 Stirng * @param bytes ...

  5. Code Review Checklist and Guidelines for C# Developers

    Checklist1. Make sure that there shouldn't be any project warnings.2. It will be much better if Code ...

  6. Configure Pi as simulation hardware for Simulink

    1. Only version not older than R2013 supports Raspberry Pi. First, download support package in Matla ...

  7. Send or receive files via Xshell

    1. install lrzsz $ sudo apt-get install lrzsz 2. If you want to send file from your pc to pi, just d ...

  8. 微信公众号发送客服消息提示errcode":45015,"errmsg":"response out of time limit or subscription is canceled hint:解决办法【已解决】

    微信公众号发送客服消息提示errcode":45015,"errmsg":"response out of time limit or subscription ...

  9. 使用ABP框架踩过的坑系列1

        企业级(例如ERP)应用, 一遍一遍的在重复:认证.验证.异常处理.日志.国际化和本地化.数据库连接管理.配置管理. 审计记录等,同时.NET有很多最佳实践:分层.模块化.DDD领域驱动.DI ...

  10. Python面向对象(成员修饰符)

    day25 成员修饰符 class Foo: def __init__(self, name, age): self.name = name self.__age = age#私有,外部无法直接访问 ...