将 golang []interface{} 转换为结构体列表

问题描述 投票:0回答:1

我正在尝试执行以下操作: 给定一个目标结构体

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
我不知道为什么会发生这种情况。理想情况下,我最初尝试的就是像这样简单地解组,但惨败了。如果可以的话,我宁愿避免迭代,但我不太介意。 谢谢你

json go
1个回答
0
投票
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

}

https://go.dev/play/p/jO9iKR8u8bO

© www.soinside.com 2019 - 2024. All rights reserved.