我有以下查询构建器功能: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个赞
您只能在表示结构(即)上调用NumField
或Field
方法。reflect.Type
t.Kind() == reflect.Struct
如果您有切片类型,则可以通过Elem
方法访问包含的类型,该方法返回另一个reflect.Type
. 如果切片包含一个结构体,那么你可以在这个类型上调用NumField
/ Field
。
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{}值)。
- 2 回答
- 0 关注
- 239 浏览
添加回答
举报
0/150
提交
取消