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

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


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


不能覆盖 typedSlice(类型 interface {})


这让我感到困惑,因为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 游乐场来提供帮助。


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


慕虎7371278
浏览 143回答 1
1回答

料青山看我应如是

typedSlice 的无效间接(type interface {})你不能取消引用typedSlice,因为它是一个interface{}. 您必须使用类型断言提取指针realSlice := *typedSlice.(*[]Demo)不能覆盖 typedSlice(类型 interface {})同样,由于typedSlice是interface{},您不能对其进行范围调整。如果你想跨越你需要使用类型断言的值,或者通过反射手动迭代:for i := 0; i < o.Elem().Len(); i++ {&nbsp; &nbsp; ret = append(ret, o.Elem().Index(i).Interface())}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go