如何将未知类型的数组强制转换为类型 []any?

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


package main


func unpackArray(arr any) []any {

    return arr.([]any)

}


func main() {

    myArr1 := []string {"Hey"}

    myArr2 := []int {60}

    unpackArray(myArr1)

    unpackArray(myArr2)

}

但是,此代码会产生错误panic: interface conversion: interface {} is []string, not []interface {}。所以它不允许我将静态类型不是 type 的接口[]any转换为 type []any。


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


(我遇到了与地图相同的问题,我无法从任意地图类型转换为 type map[any]any,但我猜这个问题的解决方案类似于数组的解决方案。)


月关宝盒
浏览 104回答 2
2回答

米脂

Go 没有像这样的内置“强制转换”,但您可以编写一个函数来完成它。您可以使用反射将任何类型的切片转换为 []any:func unpackArray(s any) []any {&nbsp; &nbsp; v := reflect.ValueOf(s)&nbsp; &nbsp; r := make([]any, v.Len())&nbsp; &nbsp; for i := 0; i < v.Len(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; r[i] = v.Index(i).Interface()&nbsp; &nbsp; }&nbsp; &nbsp; return r}您还可以在 Go 1.18 或更高版本中使用泛型:func unpackArray[S ~[]E, E any](s S) []any {&nbsp; &nbsp; r := make([]any, len(s))&nbsp; &nbsp; for i, e := range s {&nbsp; &nbsp; &nbsp; &nbsp; r[i] = e&nbsp; &nbsp; }&nbsp; &nbsp; return r}这些函数的两个版本都按照问题中的要求工作:myArr1 := []string {"Hey"}myArr2 := []int {60}unpackArray(myArr1)unpackArray(myArr2)笔记:Go 没有像其他一些语言那样的“cast”。Go 有一些相关的类型断言和转换特性。该表达式arr.([]any)是一个类型断言。该表达式断言接口中的具体值arr具有类型[]any。表达式不做任何转换。问题中的代码使用slices,而不是标题中写的数组。

慕少森

不可能直接这样做,因为这不是一回事。any是相同的interface{},每个interface{}都是双指针(第一个是“元数据”/“类型信息”,第二个是指向原始数据的指针)。如果你[]uint{60, 42}有一个切片,每个元素都是 8 字节(考虑 64 位)。所以,如果你强制它是[]any,每个元素现在占用 16 个字节,这会破坏一切。您可以使用unsafe.“转换”的唯一方法是复制信息,因此,您可以创建一个新的切片,[]any然后将每个值附加到该新切片中。复制的一个例子是:// You can edit this code!package mainfunc unpackArray[T any](arr any) (r []any) {&nbsp; &nbsp; o := arr.([]T)&nbsp; &nbsp; r = make([]any, len(o))&nbsp; &nbsp; for i, v := range o {&nbsp; &nbsp; &nbsp; &nbsp; r[i] = any(v)&nbsp; &nbsp; }&nbsp; &nbsp; return r}func main() {&nbsp; &nbsp; myArr1 := []string{"Hey"}&nbsp; &nbsp; myArr2 := []int{60}&nbsp; &nbsp; unpackArray[string](myArr1)&nbsp; &nbsp; unpackArray[int](myArr2)}然而,这并没有多大意义,因为您可以以另一种方式使用泛型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go