Golang将接口{}转换为N大小的数组

时间:2019-05-03 13:20:44

标签: arrays go interface type-assertion

我在接口中包装了一个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的类型不同,因此我必须明确枚举所有可能的大小。

1 个答案:

答案 0 :(得分:2)

在这里反映您的朋友:

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所做的是通过反射索引输入接口的值。这不是很快,但是可以解决问题。