不能使用反射然后通过json.Unmarshal制作的切片上的范围

时间:2015-12-08 18:21:07

标签: reflection go type-conversion slice

我从以下代码中收到以下错误:

  

typedSlice的无效间接(type interface {})

     

不能超过typedSlice(类型接口{})

这让我感到困惑,因为reflect.TypeOf(copy)t的类型匹配。

func Unmarshal(t reflect.Type) []interface{} {

    ret := []interface{}{}
    s := `[{"Name":"The quick..."}]`

    slice := reflect.Zero(reflect.SliceOf(t))
    o := reflect.New(slice.Type())
    o.Elem().Set(slice)
    typedSlice := o.Interface()

    json.Unmarshal([]byte(s), typedSlice)

    fmt.Println(typedSlice)                 // &[{The quick...}]
    fmt.Println(reflect.TypeOf(typedSlice)) //same type as t
    fmt.Println(*typedSlice)                // invalid indirect of copy (type interface {})

    for _, l := range typedSlice {          //cannot range over copy (type interface {})
        ret = append(ret, &l)
    }

    return ret
}

我创建了一个go playground,其中包含有效的工作代码。

为什么看起来这个切片打印出一种类型但是编译为另一种?

1 个答案:

答案 0 :(得分:4)

  

typedSlice的无效间接(type interface {})

您无法取消引用typedSlice,因为它是interface{}。您必须使用类型断言

提取指针
realSlice := *typedSlice.(*[]Demo)
  

不能超过typedSlice(类型接口{})

同样,由于typedSliceinterface{},因此您无法超越它。如果要超出值,则需要使用类型断言,或通过反射手动迭代:

for i := 0; i < o.Elem().Len(); i++ {
    ret = append(ret, o.Elem().Index(i).Interface())
}