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
}
相关推荐
毕设源码-朱学姐4 分钟前
【开题答辩全过程】以 基于SpringBoot+Vue的百货商品进出货平台为例,包含答辩的问题和答案
java·spring boot·后端
码路飞5 分钟前
Claude Code 大规模封号,我花了一晚上才搞明白:setup token 和 API key 根本不是一回事
后端·claude
Cache技术分享11 分钟前
359. Java IO API - 路径比较与处理
前端·后端
Leo89911 分钟前
go从零单排之defer源码
后端
Java水解14 分钟前
SQL 核心概念:JOIN 和 UNION 到底有什么区别?
后端·sql
CSDN_Colinw14 分钟前
C++中的工厂方法模式
开发语言·c++·算法
liulilittle17 分钟前
范围随机算法实现
开发语言·c++·算法·lua·c·js
夜空下的星18 分钟前
springboot实现Minio大文件分片下载
java·spring boot·后端
lizhongxuan19 分钟前
Claude Mem:为什么长上下文不等于好记忆
后端
乌索普-20 分钟前
基于vue2的简易购物车
开发语言·前端·javascript