繁体   English   中英

解组任意结构的列表并将其附加到带有反射的切片

[英]Unmarshal list of arbitrary struct and append it to slice with reflection

我想解组一个 JSON 字符串,它将是一个任意结构的列表(在运行时确定),并将解组的结构列表附加到提供给函数的切片(类型在运行前未知,但是是一个切片列表被解组的同时)。

这是我想要实现的最小示例(此处游乐场链接):

type Foo struct {
    Name string
}

func get(results interface{}) (interface{}, error) {
    resVal := reflect.ValueOf(results)
    data := reflect.New(resVal.Type())

    err := json.Unmarshal([]byte(`[{"name":"data"},{"name":"test"}]`), data.Interface())
    if err != nil {
        return nil, err
    }

    return reflect.Append(resVal, data).Interface(), nil
}

func main() {
    results := []Foo{}
    newResults, err := get(results)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%#v\n", newResults)
}

我相信以上应该有效,但我得到:

panic: reflect.Set: value of type *[]main.Foo is not assignable to type main.Foo

您可以使用AppendSlice来附加由reflect.Value表示的切片的各个元素。 请注意,您的data表示指向切片的指针,因此您必须执行data.Elem()才能到达切片。

reflect.AppendSlice(resVal, data.Elem()).Interface()

https://play.golang.org/p/xTfoEvgMoh_U


或者您可以使用Append但您必须手动解包data.Elem()表示的切片。

data = data.Elem()
slice := make([]reflect.Value, data.Len())
for i := range slice {
    slice[i] = data.Index(i)
}
reflect.Append(resVal, slice...).Interface()

https://play.golang.org/p/YcDvv24xZoo

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM