go的reflect实战

架构设计,有处设计,需要将string类型转为instance的实际类型,不更改业务代码的前提下,修改接口数据

因为涉及到unmarshal,因此要先判断instance中的存储的值是否已经是一个指针

如果不是,则需要包装为一个指针类型

进行unmarshal,最终拿到实际的解析结果

解析完之后,再根据最开始是否有过包装行为,将区别返回

从而实现架构上0业务代码的侵入

go 复制代码
// 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 bool
	if 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
}
相关推荐
IT_陈寒9 分钟前
为什么我的JavaScript闭包总是漏掉那个变量?
前端·人工智能·后端
进制树19 分钟前
【飞控开发实战·⑲】ROS2无人机开发环境搭建:Jazzy安装、工作空间与hello_drone节点实战
开发语言·安全·无人机·课程设计
牛马也想出海42 分钟前
亚马逊爬虫代理IP:IP类型选择与配置指南
开发语言·php
用户8356290780511 小时前
如何使用 Python 将 PowerPoint 转换为 PDF 文档
后端·python
菜冻鱼1 小时前
Python-pytorch-高级技巧
开发语言·人工智能·pytorch·python·深度学习·神经网络·聚类
倔强的石头_1 小时前
从 8 行报错到一条故障链:我用蓝耘 MaaS 做了一个 AI 日志分析助手
后端
lpfasd1231 小时前
python webview打包版卡死、开发版正常
开发语言·python
敲个大西瓜1 小时前
Spring Could Alibaba 核心面试题
java·后端·spring
用户8356290780511 小时前
如何使用 Python 为 PowerPoint 幻灯片添加切换效果
后端·python
weixin_461408581 小时前
npm npx yarn
开发语言·前端·javascript