Golang преобразовывает интерфейс {} в массив размера N - PullRequest
0 голосов
/ 03 мая 2019

У меня есть массив 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 Ответ

2 голосов
/ 03 мая 2019

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 - это индексирование значения вашего интерфейса ввода с помощью отражения.Это не быстро, но это помогает.

...