我正在尝试执行以下操作: 给定一个目标结构体
targetModel
,这是一个基本结构体,例如 User
,将这些保存为字节的结构体列表转换为 golang 结构体列表。
这是我最新的尝试,但无法编译:
func (r *RedisWrapper) GetList(ctx context.Context, key string, targetModel interface{}) (interface{}, error) {
object, err := r.redis.Get(ctx, key).Result()
if err == nil {
copiedSlice := reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf(targetModel).Elem()), 0, 0).Interface()
copiedModel := make([]interface{}, 0)
err = json.Unmarshal([]byte(object), &copiedModel) //copiedModel := reflect.MakeSlice(reflect.SliceOf(reflect.TypeOf(targetModel)), 0, 0).Interface()
//err = json.Unmarshal([]byte(object), &copiedModel)
if err != nil {
logrus.Errorf("Failed to unmarshal object %s with key %s into %#v with err %s", object, key, targetModel, err)
return nil, err
}
for _, i := range copiedModel {
copiedSlice = append(copiedSlice, i)
}
return copiedModel, nil
}
return nil, err
}
我是:
追加功能失败,显示为
Cannot use 'copiedSlice' (type any) as the type []Type
我不知道为什么会发生这种情况。理想情况下,我最初尝试的就是像这样简单地解组,但惨败了。如果可以的话,我宁愿避免迭代,但我不太介意。
谢谢你
func GetList(targetModel interface{}) (interface{}, error) {
object, err := redis_data()
if err != nil {
return nil, err
}
dst := reflect.New(reflect.SliceOf(reflect.TypeOf(targetModel).Elem()))
if err := json.Unmarshal([]byte(object), dst.Interface()); err != nil {
return nil, err
}
return dst.Elem().Interface(), nil
}