Как преобразовать срез в массив? - PullRequest
0 голосов
/ 22 января 2019

Я хочу реализовать метод для преобразования среза interface{} в массив interface{}, длина которого равна заданному срезу. Это похоже на ниже:

func SliceToArray(in []interface{}) (out interface{}) {
 ...
}
// out's type is [...]interface{} and len(out)==len(in)

Как я могу реализовать этот метод?

EDIT: Можно ли использовать reflect.ArrayOf для реализации этого?

1 Ответ

0 голосов
/ 22 января 2019

Используйте refle.ArrayOf , чтобы создать тип массива с учетом типа элемента среза.Используйте refle.New , чтобы создать значение этого типа.Используйте refle.Copy для копирования из среза в массив.

func SliceToArray(in interface{}) interface{} {
    s := reflect.ValueOf(in)
    if s.Kind() != reflect.Slice {
        panic("not a slice")
    }
    t := reflect.ArrayOf(s.Len(), s.Type().Elem())
    a := reflect.New(t).Elem()
    reflect.Copy(a, s)
    return a.Interface()
}

Запустите его на игровой площадке

Эта функция полезна длясоздание ключа карты из среза и других сценариев, где требуется сопоставимое значение.В противном случае обычно лучше использовать срез, когда длина может быть произвольной.

...