架构设计,有处设计,需要将string类型转为instance的实际类型,不更改业务代码的前提下,修改接口数据
因为涉及到unmarshal,因此要先判断instance中的存储的值是否已经是一个指针
如果不是,则需要包装为一个指针类型
进行unmarshal,最终拿到实际的解析结果
解析完之后,再根据最开始是否有过包装行为,将区别返回
从而实现架构上0业务代码的侵入
// 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 boolif 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
}