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
}
相关推荐
追逐时光者1 分钟前
一个开源免费、轻量级的 Avalonia UI 控件库
后端·.net
间彧17 分钟前
Java守护线程详解
后端
程子的小段21 分钟前
C 语言实例 - 字符串复制
c语言·开发语言
间彧27 分钟前
Java Thread类源码详解与项目实战
后端
间彧28 分钟前
🔍 Java Thread类全面解析与实战指南
后端
间彧30 分钟前
Thread类的静态方法和实例方法详解、区别、应用场景、项目实战
后端
-森屿安年-40 分钟前
STL 容器:stack
开发语言·c++
歪歪10042 分钟前
C#如何在数据可视化工具中进行数据筛选?
开发语言·前端·信息可视化·前端框架·c#·visual studio
Captaincc2 小时前
AI 能帮你写代码,但把代码变成软件,还是得靠人
前端·后端·程序员
Jyywww1212 小时前
Python基于实战练习的知识点回顾
开发语言·python