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

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

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

Go
月关宝盒 2023-01-03 15:57:02
假设只有数组作为参数传递给arr参数,我希望每次调用都unpackArray()返回从其原始数组类型转换为 type 的参数[]any。package mainfunc 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,但我猜这个问题的解决方案类似于数组的解决方案。)
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

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


您可以使用反射将任何类型的切片转换为 []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 有一些相关的类型断言转换特性。

  • 该表达式arr.([]any)是一个类型断言。该表达式断言接口中的具体值arr具有类型[]any。表达式不做任何转换。

  • 问题中的代码使用slices,而不是标题中写的数组。


查看完整回答
反对 回复 2023-01-03
?
慕少森

TA贡献2019条经验 获得超9个赞

不可能直接这样做,因为这不是一回事。


any是相同的interface{},每个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)

}

然而,这并没有多大意义,因为您可以以另一种方式使用泛型。


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

添加回答

举报

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