如何从反射切片获取原始类型

时间:2020-04-14 14:31:13

标签: go reflection

我要检查表引用字段是否存在,该字段将结构用于ormer查询表。 VaildData函数采用仅vailed指针结构的v的不同结构或切片和beego orm.NewOrm().Read(v)

func VaildData(cols ...interface{}) (err error) {
    for _, col := range cols {
        value := reflect.ValueOf(col)
        switch reflect.TypeOf(col).Kind() {
        case reflect.Slice:
            if length := value.Len(); length > 0 {
                for i := 0; i < length; i++ {
                    logs.Info("slice is %v", value.Index(i).Elem().Type().Name())
                    t := value.Index(i).Elem().Type()
                    a := value.Index(i).Interface().(t)
                    err = Ormer().Read(a)
                    if err != nil {
                        return err
                    }
                }
            }
        case reflect.Ptr:
            logs.Info(value)
            t := value.Interface().Type()
            err = Ormer().Read(value.Interface().(t))
            if err != nil {
                return err
            }
        default:
            return fmt.Errorf("invalid collection type, need pointer or slice pointer %s", reflect.ValueOf(col))
        }


    }
    return nil
}


type Cluster struct {
    ID int
    Name string
    Environments []*Environment
    Region *Region
}

type Environment struct {
    ID int
    Name string
}

type Region struct {
   ID int
   Name string
}

c := Cluster{}
err := VaildData(c.Environments, c.Region)

但这不起作用,它会排除错误。

t is not a type

0 个答案:

没有答案
相关问题