【问题标题】:Golang convert interface{} to array of N sizeGolang 将 interface{} 转换为 N 大小的数组
【发布时间】:2019-09-22 01:15:42
【问题描述】:

我有一个包含在接口中的T 数组。我事先知道数组的大小。如何编写一个通用函数来获取任何数组长度的数组(或切片)?例如。对于尺寸 3,我想要类似的东西

var values interface{} = [3]byte{1, 2, 3}
var size = 3 // I know the size

var _ = values.([size]byte) // wrong, array bound must be a const expression

我不能真正进行类型切换,因为 [1]byte[2]byte 等类型不同,所以我必须明确枚举所有可能的大小。

【问题讨论】:

  • 你不能。由于错误状态,数组大小必须是一个常量表达式;大小是数组类型定义的一部分,Go 是编译时类型安全的。如果您需要不同大小的数组,请改用切片。
  • 即使size 可以是运行时值,您会如何处理结果?除了interface{} 类型的变量之外,您不能将它分配给任何东西,然后您又回到了开始的地方。
  • 固定大小的数组在 Go 中很少有用。你确定不能在这里只使用切片吗?
  • @EliBendersky @Adrian 我可以在“接收器”类型中使用切片,但作为固定大小数组的原始类型来自一个库,该库将一些数据解组并将它们放入 []interface (因为最初它们可以是任何类型)。我需要的是获取 []interface 类型中的值,但我可以吗?
  • 你能指出在输入库中进行编组的代码吗?

标签: arrays go interface type-assertion


【解决方案1】:

Reflect 是你的朋友:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var in interface{} = [3]byte{1, 2, 3} // an element from your []interface{}
    var size = 3                          // you got this
    out := make([]byte, size)             // slice output

    for i := 0; i < size; i++ {
        idxval := reflect.ValueOf(in).Index(i) // magic here
        uidxval := uint8(idxval.Uint())        // you may mess around with the types here
        out[i] = uidxval                       // and dump in output
    }

    fmt.Printf("%v\n", out)
}

切片是这里更好的选择输出,因为您指出您有一个未定义的长度。 Magic 这里所做的是通过反射索引输入接口的值。这不是很快,但它可以解决问题。

【讨论】:

  • 这正是我想要的!谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 2014-12-30
  • 2019-05-27
  • 2017-01-17
  • 2018-11-08
  • 1970-01-01
相关资源
最近更新 更多