Как создать срез структуры с отражением в Go

мне нужно создать срез структуры из ее интерфейса с отражением.

я использовал отражение, потому что не вижу никакого другого решения без его использования.

кратко, функция получает переменные значения интерфейса.

затем, с отражением создает фрагмент и передает его в другую функцию.

отражение просит ввести утверждение

SliceVal.Interface().(SomeStructType)

но я не могу его использовать.

код в площадка http://play.golang.org/p/EcQUfIlkTe

код:

package main

import (
    "fmt"
    "reflect"
)

type Model interface {
    Hi()
}

type Order struct {
    H string
}

func (o Order) Hi() {
    fmt.Println("hello")
}

func Full(m []Order) []Order{
    o := append(m, Order{H:"Bonjour"}
    return o
}

func MakeSlices(models ...Model) {
    for _, m := range models {
        v := reflect.ValueOf(m)
        fmt.Println(v.Type())
        sliceType := reflect.SliceOf(v.Type())
        emptySlice := reflect.MakeSlice(sliceType, 1, 1)
        Full(emptySlice.Interface())
    }
}
func main() {
    MakeSlices(Order{})
}

1 ответов


ты почти на месте. Проблема в том, что вам не нужно вводить-assert для типа структуры, а для типа среза.

так вместо

SliceVal.Interface().(SomeStructType)

вы должны:

SliceVal.Interface().([]SomeStructType)

и в вашем конкретном примере-просто изменение следующей строки заставляет ваш код работать:

Full(emptySlice.Interface().([]Order))

теперь, если у вас есть много возможных моделей, вы можете сделать следующее:

switch s := emptySlice.Interface().(type) {
case []Order:
    Full(s)
case []SomeOtherModel:
    FullForOtherModel(s)
// etc
}