当前位置: 首页 > news >正文

go的reflect实战

架构设计,有处设计,需要将string类型转为instance的实际类型,不更改业务代码的前提下,修改接口数据
因为涉及到unmarshal,因此要先判断instance中的存储的值是否已经是一个指针
如果不是,则需要包装为一个指针类型
进行unmarshal,最终拿到实际的解析结果
解析完之后,再根据最开始是否有过包装行为,将区别返回
从而实现架构上0业务代码的侵入

// string->interface
func demo(ctx context.Context, respStr string, instance interface{}) (interface{}, error) {v := reflect.ValueOf(instance)if !v.IsValid() {return nil, errors.New("demo_any_invalid")}if v.Kind() == reflect.String {return respStr, nil}dstAny := v.Interface()var needDeref boolif v.Kind() != reflect.Ptr {ptr := reflect.New(v.Type())dstAny = ptr.Interface()needDeref = true}if err := jsonx.UnmarshalFromString(respStr, dstAny); err != nil {return nil, errors.New("demo_unmarshal_fail")}if !needDeref {return dstAny, nil}derefDstAny := reflect.ValueOf(dstAny)if derefDstAny.Kind() != reflect.Ptr {return nil, errors.New("demo_tmp_any")}return derefDstAny.Elem().Interface(), nil
}
http://www.lryc.cn/news/383870.html

相关文章:

  • 【学习】常用的分类网络
  • 3. 向索引库中导入数据
  • java-冒泡排序 2
  • 记一次面试
  • Linux提升篇-正则表达式
  • 专利、论文免费检索
  • 【Qt】QSettings使用
  • Js逆向爬虫基础篇
  • 同步时钟系统为何能成为机场时间管理的好伙伴?
  • Robust semi-supervised segmentationwith timestep ensembling diffusion models
  • 如何迁移R包
  • 如何在next14项目中加入favicon
  • 【深度学习】基础数据结构+访问
  • 一个产品需求工程师繁忙的一天
  • MD5加密接口
  • AI大模型日报#0626:首款大模型芯片挑战英伟达、面壁智能李大海专访、大模型测试题爆火LeCun点赞
  • 专业技能篇---计算机网络
  • Matlab|【免费】含氢气氨气综合能源系统优化调度
  • python的一些常用的内建函数
  • Docker部署常见应用之Oracle数据库
  • 小程序中echarts的bug
  • 项目验收测试有必要找第三方软件测试机构吗?
  • 【python入门】循环语句
  • php调用soap, 报错 failed to load external entity‘http://xxxxxxxx?wsdl‘ 解决方法
  • ts可选参数
  • day41--Redis(三)高级篇之最佳实践
  • PDF 生成(4)— 目录页
  • 黑盒测试用例的四种设计方法
  • GIT重新提交-恢复到暂存状态
  • 半藏酒商业模式解读,半藏酱酒营销案例,半藏总院分院招商模式