如何将切片转换为数组?

时间:2019-01-22 07:59:30

标签: arrays go slice reflect

我想实现一种方法,将interface{}切片转换为interface{}数组,该数组的长度与给定的切片相等。类似于以下内容:

func SliceToArray(in []interface{}) (out interface{}) {
 ...
}
// out's type is [...]interface{} and len(out)==len(in)

如何实现此方法?

编辑: 有可能使用reflect.ArrayOf来实现吗?

1 个答案:

答案 0 :(得分:0)

使用reflect.ArrayOf创建给定切片元素类型的数组类型。使用reflect.New创建该类型的值。使用reflect.Copy从切片复制到数组。

func SliceToArray(in interface{}) interface{} {
    s := reflect.ValueOf(in)
    if s.Kind() != reflect.Slice {
        panic("not a slice")
    }
    t := reflect.ArrayOf(s.Len(), s.Type().Elem())
    a := reflect.New(t).Elem()
    reflect.Copy(a, s)
    return a.Interface()
}

Run it on the Playground

此功能对于从切片和其他需要可比较值的方案中创建映射键很有用。否则,通常最好在长度可以是任意的情况下使用切片。