当前位置: 首页 > 面试题库 >

无法在通过反射然后传递的json制成的切片上使用范围。

戚建华
2023-03-14
问题内容

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

typedSlice的无效间接输入(类型接口{})

不能超出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 go操场,其中包含工作代码以提供帮助。

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


问题答案:

typedSlice的无效间接输入(类型接口{})

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

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

不能超出typedSlice(类型接口{})的范围

同样,由于typedSliceinterface{},因此您无法覆盖它。如果要覆盖这些值,则需要使用类型断言,或者通过反射手动进行迭代:

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


 类似资料:
  • 问题内容: 我有一个要使用函数更改的切片(例如,我想删除第一个元素)。我以为可以使用指针,但仍然无法为其编制索引。我究竟做错了什么? 游乐场链接: 问题答案: 您需要使用。 或通常更像偶像的另一种方法:

  • 因此,我正在研究一个概念,它涉及到自动写入一个类的内容,扩展 例如,我们的想法是声明以下内容 然后,每当第一次调用时,就会初始化它,然后按照指定的顺序将其内容写入本机地址。 但我遇到的唯一问题是收集成员,以便稍后作为参数传递给I-th 因为编译器在这里抱怨: 错误:(328,37)Kotlin:Out投影类型“KProperty1”禁止使用Kotlin中定义的“public abstract fu

  • 我有以下代码来检索http和https的默认,它通过访问静态包作用域方法,在Java8中工作: 这在jigsaw的Java9中仍然是可能的,还是禁止以这种方式修改可见性?

  • 问题内容: 我有以下代码: 但是我想将一个指向字节切片的指针传递给另一个函数,并在那里切片,所以类似: 它给我一个错误,我不能在函数参数中使用type 作为类型,并且不能对type进行切片。怎么了?默认情况下切片不是通过引用传递的吗?我试图在没有指针的情况下执行此操作,但是它不起作用- 正在复制数组。我怎样才能做到这一点? 问题答案: 该错误来自您尚未发布的拼写错误(您尝试传递一个切片而不是指向的

  • 问题内容: 我有一个带有接口参数的函数: 我如何通过它传递一个零值,使其通过检查? 方法1: 方法二: 由于https://golang.org/doc/faq#nil_error,第二种方法不起作用 游乐场:https : //play.golang.org/p/V0bMSPcCKI 问题答案: 使用以下内容创建: 问题中的第一种方法不起作用,因为表达式返回。nil接口值的具体类型为nil。 诀

  • 我有一个类(在我的项目中是一个单例),带有一些变量。我想通过在函数中传递变量的名称来获得其中的一个变量。现在我有: