Go 反射

反射

程序可以在运行时检查变量和值,求出他们的类型。code

reflect包

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

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")
}
相关文章
相关标签/搜索