反映 Empty 切片底层类型的字段?

我有以下查询构建器功能:


func CreateQuery(t interface{}, where string) {

    var b bytes.Buffer

    b.WriteString("SELECT ")


    s := reflect.ValueOf(t).Elem()

    typeOfT := s.Type()


    for i := 0; i < s.NumField() - 1; i++ {

        b.WriteString(fmt.Sprintf("%s, ", typeOfT.Field(i).Name))

    }


    //Last one has no Comma

    b.WriteString(fmt.Sprintf("%s ", typeOfT.Field(s.NumField() - 1).Name))


    b.WriteString(fmt.Sprintf("FROM %s ", typeOfT.Name()))

    b.WriteString(where)

    fmt.Println(b.String())

}

按如下方式调用时工作正常:


var dst FooStruct

CreateQuery(&dst, "")

但以下引发了“对切片值调用reflect.Value.NumField”恐慌:


var dst []FooStruct

CreateQuery(&dst, "")

我怎样才能让函数打印切片的底层结构类型的字段?似乎我想要反射SliceOf功能的倒数。


潇湘沐
浏览 240回答 2
2回答

蝴蝶刀刀

您只能在表示结构(即)上调用NumField或Field方法。reflect.Typet.Kind() == reflect.Struct如果您有切片类型,则可以通过Elem方法访问包含的类型,该方法返回另一个reflect.Type.&nbsp;如果切片包含一个结构体,那么你可以在这个类型上调用NumField/&nbsp;Field。

12345678_0001

您可以遍历切片,调用CreateQuery每个查询:func CreateQueries(t interface{}, where string) {&nbsp; &nbsp; v := reflect.ValueOf(t)&nbsp; &nbsp; if v.Kind() == reflect.Ptr {&nbsp; &nbsp; &nbsp; &nbsp; v = v.Elem()&nbsp; &nbsp; }&nbsp; &nbsp; if v.Kind() == reflect.Array || v.Kind() == reflect.Slice {&nbsp; &nbsp; &nbsp; &nbsp; for i := 0; i < v.Len(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CreateQuery(v.Index(i).Interface(), where)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}使用reflect.Value.Index您可以单独访问每个字段,调用.Interface()该值会产生该值的interface{}类型表示,使其适合将其放入您的CreateQuery函数中(需要一个interface{}值)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go