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")
}
相關文章
相關標籤/搜索