如何使用反射创建结构切片?

我需要使用反射从其接口创建一个结构切片。


我使用反射是因为不使用它就看不到任何其他解决方案。


简而言之,该函数接收接口的可变参数值。


然后,使用反射创建切片并将其传递给另一个函数。


反射要求输入断言


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{})

}


茅侃侃
浏览 207回答 1
1回答

慕神8447489

您快到了。问题是您不需要对结构类型进行类型断言,而是对切片类型进行类型断言。所以代替SliceVal.Interface().(SomeStructType)你应该做:SliceVal.Interface().([]SomeStructType)在您的具体示例中 - 只需更改以下行即可使您的代码工作:Full(emptySlice.Interface().([]Order))现在,如果您有许多可能的模型,您可以执行以下操作:switch s := emptySlice.Interface().(type) {case []Order:    Full(s)case []SomeOtherModel:    FullForOtherModel(s)// etc}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go