2019-05-03 13:20
浏览 420


I have an array of T wrapped in an interface. I know the size of the array beforehand. How do I write a generic function that gets back an array (or a slice) for any array length? E.g. for size 3 I want something like

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

I can't really do a type switch because [1]byte is a different type from [2]byte etc so I'd have to explicitly enumerate all possible sizes.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dougai8673
    dougai8673 2019-05-03 19:30

    Reflect is your friend here:

    package main
    import (
    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
    ", out)

    Slices are the better choice output here, since you indicate that you have an undefined length. What Magic here does is indexing the value of your input interface through reflect. This is not quick, but it does the trick.

    点赞 评论