我需要使用反射从其接口创建一个结构切片。我使用反射是因为不使用它就看不到任何其他解决方案。简而言之,该函数接收接口的可变参数值。然后,使用反射创建切片并将其传递给另一个函数。反射要求输入断言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
}
- 1 回答
- 0 关注
- 206 浏览
添加回答
举报
0/150
提交
取消