登录
首页 >  Golang >  Go问答

如何将列表转换为数组?

来源:stackoverflow

时间:2024-03-02 23:45:27 330浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《如何将列表转换为数组?》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

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

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

如何实现这个方法?

编辑: 是否可以使用 reflect.arrayof 来实现此目的?


解决方案


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

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

go 1.20(2023 年第一季度)应该会在 issue 46505: "spec: allow conversion from slice to array" 之后促进这样的转换

此问题可通过 CL 430415428938 (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)

到这里,我们也就讲完了《如何将列表转换为数组?》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>