簡體   English   中英

如何使用反射創建結構切片?

[英]How to create slice of struct using reflection?

我需要使用反射從其接口創建一個結構切片。

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

簡而言之,該函數接收接口的可變參數值。

然后,使用反射創建切片並將其傳遞給另一個函數。

反射要求輸入斷言

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

您快到了。 問題是您不需要對結構類型進行類型斷言,而是對切片類型進行類型斷言。

所以代替

SliceVal.Interface().(SomeStructType)

你應該做:

SliceVal.Interface().([]SomeStructType)

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

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

現在,如果您有許多可能的模型,您可以執行以下操作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM