程序可以在運行時檢查變量和值,求出他們的類型。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") }