我从下面的代码中收到以下错误:
typedSlice的无效间接输入(类型接口{}) 不能超出typedSlice(类型接口{})的范围
typedSlice的无效间接输入(类型接口{})
不能超出typedSlice(类型接口{})的范围
这让我感到困惑,因为reflect.TypeOf(copy)匹配的类型t。
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 go操场,其中包含工作代码以提供帮助。
为什么看起来该切片打印一种类型但编译为另一种类型?
您不能取消引用typedSlice,因为它是一个interface{}。您将必须使用类型断言来提取指针
typedSlice
interface{}
realSlice := *typedSlice.(*[]Demo)
同样,由于typedSlice是interface{},因此您无法覆盖它。如果要覆盖这些值,则需要使用类型断言,或者通过反射手动进行迭代:
for i := 0; i < o.Elem().Len(); i++ { ret = append(ret, o.Elem().Index(i).Interface()) }