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
}
相关推荐
用户895356032822020 小时前
Goroutine + Channel 高效在哪?一文吃透 Go 并发底层 G-M-P 调度与实现
后端·go
鸽芷咕20 小时前
静态住宅 IP 实战测评:手把手教你高效获取全球前沿资讯
后端
西召20 小时前
Spring Kafka 动态消费实现案例
java·后端·kafka
lomocode20 小时前
前端传了个 null,后端直接炸了——防御性编程原来这么重要!
后端·ai编程
镜花水月linyi20 小时前
ThreadLocal 深度解析(上)
java·后端
镜花水月linyi20 小时前
ThreadLocal 深度解析(下)
java·后端
liu****21 小时前
9.二叉树(一)
c语言·开发语言·数据结构·算法·链表
她说..21 小时前
Spring AOP场景2——数据脱敏(附带源码)
java·开发语言·java-ee·springboot·spring aop
JavaEdge.21 小时前
Spring数据源配置
java·后端·spring
sunly_21 小时前
Flutter:showModalBottomSheet底部弹出完整页面
开发语言·javascript·flutter