Как создать срез структуры с отражением в 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
}