如何在运行时指定类型的元素数组

时间:2018-09-19 00:21:22

标签: go struct

我试图创建一个只有在运行时才知道类型的元素数组(pkg API可以在json中检索元素并将其转换为struct)。我有一个类似于以下的辅助函数,该函数将接口作为参数,并在调用make时尝试获取接口的类型。

golang编译器似乎不喜欢它。

var whatAmI = func(i interface{}) { 
        a := reflect.TypeOf(i)

        //var typ reflect.Type = a

        b := make (a, 10)    //10 elem with type of i

        //b := new (typ)
        fmt.Printf ("a: %v b: %v", a, b)
}

prog.go:21:14:a不是类型

我尝试了各种反射组合,但到目前为止没有帮助。 在我看来,这可能是一个常见的问题。我该如何解决/解决这个问题?

2 个答案:

答案 0 :(得分:4)

获取给定元素类型值为v的切片的类型:

sliceType := reflect.SliceOf(reflect.TypeOf(v))

创建一个具有长度和容量的切片(此处均为10)。

slice:= reflect.MakeSlice(sliceType, 10, 10)

根据您正在执行的操作,您可能需要通过在reflect.Value上调用Interface()来获取实际的切片值:

s := slice.Interface()

Run it on the playground

答案 1 :(得分:2)

就像这样:

b := make([]interface{}, 10)
for i := range b {
    b[i] = reflect.Zero(a)
}