我有以下查詢生成器功能:反映一個空的片段的領域Underyling類型?
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
函數的反函數。
明白了,所以我需要做一些事情:'typeOfT:= s.Type()' ,然後'ContainedtypeOfT:= typeOfT.Elem()'。然後該函數的其餘部分引用'ContainedtypeOfT'而不是's'或'TypeofT' –