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

如何将切片转换为数组?

如何将切片转换为数组?

Go
largeQ 2023-06-01 18:00:11
我想实现一种将interface{}切片转换为与interface{}给定切片长度相等的数组的方法。它类似于以下内容:func SliceToArray(in []interface{}) (out interface{}) { ...}// out's type is [...]interface{} and len(out)==len(in)我怎样才能实现这个方法?编辑:有可能用来reflect.ArrayOf实现这个吗?
查看完整描述

2 回答

?
陪伴而非守候

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

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

}

在操场上运行

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



查看完整回答
反对 回复 2023-06-01
?
慕斯王

TA贡献1864条经验 获得超2个赞

通过CL 430415、428938 ( type)、430475 ( reflect)和429315 ( )解决spec

从切片到数组或数组指针的转换

将切片转换为数组会生成一个包含切片底层数组元素的数组。

类似地,将切片转换为数组指针会产生指向切片底层数组的指针。

在这两种情况下,如果切片的长度小于数组的长度,就会发生运行时恐慌。

s := make([]byte, 2, 4)


a0 := ([0]byte)(s)

a1 := ([1]byte)(s[1:])   // a1[0] == s[1]

a2 := ([2]byte)(s)       // a2[0] == s[0]

a4 := ([4]byte)(s)       // panics: len([4]byte) > len(s)


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

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