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