架构设计,有处设计,需要将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
}