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

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

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

Go
潇湘沐 2021-07-06 09:42:42
我有以下查询构建器功能: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 FooStructCreateQuery(&dst, "")但以下引发了“对切片值调用reflect.Value.NumField”恐慌:var dst []FooStructCreateQuery(&dst, "")我怎样才能让函数打印切片的底层结构类型的字段?似乎我想要反射SliceOf功能的倒数。
查看完整描述

2 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

您只能在表示结构(即)上调用NumFieldField方法。reflect.Typet.Kind() == reflect.Struct

如果您有切片类型,则可以通过Elem方法访问包含的类型,该方法返回另一个reflect.Type. 如果切片包含一个结构体,那么你可以在这个类型上调用NumFieldField


查看完整回答
反对 回复 2021-07-12
?
12345678_0001

TA贡献1802条经验 获得超5个赞

您可以遍历切片,调用CreateQuery每个查询:


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

    v := reflect.ValueOf(t)


    if v.Kind() == reflect.Ptr {

        v = v.Elem()

    }


    if v.Kind() == reflect.Array || v.Kind() == reflect.Slice {

        for i := 0; i < v.Len(); i++ {

            CreateQuery(v.Index(i).Interface(), where)

        }

    }

}

使用reflect.Value.Index您可以单独访问每个字段,调用.Interface()该值会产生该值的interface{}类型表示,使其适合将其放入您的CreateQuery函数中(需要一个interface{}值)。


查看完整回答
反对 回复 2021-07-12
  • 2 回答
  • 0 关注
  • 239 浏览
慕课专栏
更多

添加回答

举报

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