为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
茅侃侃 2021-09-20 20:34:26
我需要使用反射从其接口创建一个结构切片。我使用反射是因为不使用它就看不到任何其他解决方案。简而言之,该函数接收接口的可变参数值。然后,使用反射创建切片并将其传递给另一个函数。反射要求输入断言SliceVal.Interface().(SomeStructType)但是,我不能使用它。操场上的代码http://play.golang.org/p/EcQUfIlkTe编码:package mainimport (    "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 回答

?
慕神8447489

TA贡献1780条经验 获得超1个赞

您快到了。问题是您不需要对结构类型进行类型断言,而是对切片类型进行类型断言。


所以代替


SliceVal.Interface().(SomeStructType)

你应该做:


SliceVal.Interface().([]SomeStructType)

在您的具体示例中 - 只需更改以下行即可使您的代码工作:


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

现在,如果您有许多可能的模型,您可以执行以下操作:


switch s := emptySlice.Interface().(type) {

case []Order:

    Full(s)

case []SomeOtherModel:

    FullForOtherModel(s)

// etc

}


查看完整回答
反对 回复 2021-09-20
  • 1 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信