登录
首页 >  Golang >  Go问答

如何将未知类型的数组转换为任意类型?

来源:stackoverflow

时间:2024-04-05 10:00:38 353浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《如何将未知类型的数组转换为任意类型?》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

假设仅将数组作为参数传递给 arr 参数,我希望每次调用 unpackarray() 时都返回从其原始数组类型转换为类型 []any 的参数。

package main

func unpackArray(arr any) []any {
    return arr.([]any)
}

func main() {
    myArr1 := []string {"Hey"}
    myArr2 := []int {60}
    unpackArray(myArr1)
    unpackArray(myArr2)
}

但是,此代码会产生错误 panic:接口转换:接口 {} 是 []string,而不是 []interface {}。因此,它不允许我将静态类型不是 []any 类型的接口强制转换为 []any 类型。

因此,鉴于我知道 arr 的静态类型是某种类型的数组,并且在不更改 arr 参数的初始化类型的情况下,如何使用此函数将 arr 转换为 []any 类型?

(我在地图上遇到了同样的问题,无法从任意地图类型转换为 map[any]any 类型,但我猜测此问题的解决方案与数组的解决方案类似。 )


正确答案


go 没有像这样的内置“转换”,但您可以编写一个函数来完成它。

您可以使用 reflection 将任何类型的切片转换为 []any:

func unpackarray(s any) []any {
    v := reflect.valueof(s)
    r := make([]any, v.len())
    for i := 0; i < v.len(); i++ {
        r[i] = v.index(i).interface()
    }
    return r
}

您还可以在 go 1.18 或更高版本中使用泛型:

func unpackarray[s ~[]e, e any](s s) []any {
    r := make([]any, len(s))
    for i, e := range s {
        r[i] = e
    }
    return r
}

这些函数的两个版本都按问题中的要求工作:

myarr1 := []string {"hey"}
myarr2 := []int {60}
unpackarray(myarr1)
unpackarray(myarr2)

注释:

  • go 不像其他一些语言那样有“cast”。 go 有一些相关的 type assertionconversion 功能。
  • 表达式 arr.([]any) 是一个类型断言。该表达式断言接口 arr 中的具体值的类型为 []any。该表达式不进行任何转换。
  • 问题中的代码使用 slices ,而不是标题中所写的 arrays

不可能直接这样做,因为它不是同一件事。

anyinterface{} 相同,每个 interface{} 都是双指针(第一个是“元数据”/“类型信息”,第二个是指向原始数据的指针)。

如果您有 []uint{60, 42},则您有一个切片,每个元素都是 8 字节(考虑 64 位)。所以,如果你强制它是 []any,每个元素现在占用 16 个字节,这会破坏一切。 您可以使用 unsafe 来完成此操作。

“转换”的唯一方法是复制信息,因此,您可以创建 []any 的新切片,然后将每个值附加到该新切片中。

复制的一个示例是:

// You can edit this code!

package main

func unpackArray[T any](arr any) (r []any) {
    o := arr.([]T)
    r = make([]any, len(o))

    for i, v := range o {
        r[i] = any(v)
    }

    return r
}

func main() {
    myArr1 := []string{"Hey"}
    myArr2 := []int{60}
    unpackArray[string](myArr1)
    unpackArray[int](myArr2)
}

但是,这没有多大意义,因为您可以通过其他方式使用泛型。

以上就是《如何将未知类型的数组转换为任意类型?》的详细内容,更多关于的资料请关注golang学习网公众号!

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