【问题标题】:How to convert slice to array?如何将切片转换为数组?
【发布时间】:2019-06-15 15:35:46
【问题描述】:

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

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

我该如何实现这个方法?

编辑: 有没有可能使用reflect.ArrayOf 来实现这个?

【问题讨论】:

  • 这是一个非常不寻常且可能毫无意义的实现——你能描述一下你真正想要完成的事情吗?可能有更好的方法,很可能只是正常使用切片。
  • 实际上,我想使用一个不确定的切片作为映射的键,因为切片的不容量(golang.org/ref/spec#Comparison_operators),我想使用一个包含切片中所有元素的数组作为尽可能小尺寸的钥匙
  • 如果您需要映射键是长度不一致的数组,您可能需要重新考虑导致您出现这种情况的设计。

标签: arrays go slice reflect


【解决方案1】:

使用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

此函数对于从切片和其他需要可比较值的场景创建映射键很有用。否则,当长度可以任意时,通常最好使用切片。

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 2018-06-16
    • 2016-08-01
    • 1970-01-01
    • 2022-01-19
    • 2019-03-13
    • 2012-12-28
    相关资源
    最近更新 更多