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
}
相关推荐
c-c-developer几秒前
C++ Primer 标准库类型string
开发语言·c++
山茶花开时。2 分钟前
[SAP ABAP] Debug Skill
开发语言·sap·abap
奥顺互联V11 分钟前
yes镜像站群/PHP驱动的镜像站群架构实践
开发语言·架构·开源·php
taopi20241 小时前
android java系统弹窗的基础模板
android·java·开发语言
釉色清风1 小时前
【matlab】绘图 离散数据--->连续函数
开发语言·matlab
松仔log1 小时前
Java多线程——对象的组合
java·开发语言·jvm
Qhumaing1 小时前
Python学习——函数参数详解
开发语言·python·学习
酷爱码2 小时前
springboot 动态配置定时任务
java·spring boot·后端
ElvInR2 小时前
【C语言】动态内存管理
c语言·开发语言
计算机-秋大田2 小时前
基于SpringBoot的美食烹饪互动平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
vue.js·spring boot·后端·课程设计·美食