我从以下代码中收到以下错误:
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,其中包含有效的工作代码。
为什么看起来这个切片打印出一种类型但是编译为另一种?
答案 0 :(得分:4)
typedSlice的无效间接(type interface {})
您无法取消引用typedSlice
,因为它是interface{}
。您必须使用类型断言
realSlice := *typedSlice.(*[]Demo)
不能超过typedSlice(类型接口{})
同样,由于typedSlice
是interface{}
,因此您无法超越它。如果要超出值,则需要使用类型断言,或通过反射手动迭代:
for i := 0; i < o.Elem().Len(); i++ {
ret = append(ret, o.Elem().Index(i).Interface())
}