程序可以在运行时检查变量和值,求出他们的类型。code
reflect.Type表示interface{}参数的具体类型。 reflect.Value表示它具体的值。it
type order struct{ ordId int customerId int } func createQuery(q interface{}){ t := reflect.TypeOf(q) v := reflect.ValueOf(q) print type = t print value = v } func main(){ o := order{ ordId: 465, customerId: 56, } createQuery(o) }
输出:变量
Type = main.order Value = {465,56}
reflect中还有一个Kind。 Kind表示具体的类型,好比struct反射
NumField方法返回结构体中字段数量。 Field返回字段的reflect.Value。程序
func createQuery(q interface{}) { if reflect.ValueOf(q).Kind() == reflect.Struct { v := reflect.ValueOf(q) fmt.Println("Number of fields", v.NumField()) for i := 0; i < v.NumField(); i++ { fmt.Printf("Field:%d type:%T value:%v\n", i, v.Field(i), v.Field(i)) } } }
经过v.Field(i).Kind()获取具体的类型。方法
func createQuery(q interface{}) { if reflect.ValueOf(q).Kind() == reflect.Struct { t := reflect.TypeOf(q).Name() query := fmt.Sprintf("insert into %s values(", t) v := reflect.ValueOf(q) for i := 0; i < v.NumField(); i++ { switch v.Field(i).Kind() { case reflect.Int: if i == 0 { query = fmt.Sprintf("%s%d", query, v.Field(i).Int()) } else { query = fmt.Sprintf("%s, %d", query, v.Field(i).Int()) } case reflect.String: if i == 0 { query = fmt.Sprintf("%s\"%s\"", query, v.Field(i).String()) } else { query = fmt.Sprintf("%s, \"%s\"", query, v.Field(i).String()) } default: fmt.Println("Unsupported type") return } } query = fmt.Sprintf("%s)", query) fmt.Println(query) return } fmt.Println("unsupported type") }