为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕虎7371278 2021-11-29 15:34:32
我从下面的代码中收到以下错误: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 游乐场来提供帮助。为什么看起来这个切片打印一种类型但编译为另一种类型?
查看完整描述

1 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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


你不能取消引用typedSlice,因为它是一个interface{}. 您必须使用类型断言提取指针


realSlice := *typedSlice.(*[]Demo)

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


同样,由于typedSlice是interface{},您不能对其进行范围调整。如果你想跨越你需要使用类型断言的值,或者通过反射手动迭代:


for i := 0; i < o.Elem().Len(); i++ {

    ret = append(ret, o.Elem().Index(i).Interface())

}


查看完整回答
反对 回复 2021-11-29
  • 1 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信