funcreflectType(x interface{}){
v := reflect.TypeOf(x)
fmt.Printf("type:%v\n", v)}funcmain(){var a float32=3.14reflectType(a)// type:float32var b int64=100reflectType(b)// type:int64}
Kind
Go语言中可以使用type关键字构造很多自定义类型,而种类(Kind)就是指底层的类型
当需要区分指针、结构体等大品种的类型时,就会用到种类(Kind)
Name
Go语言的反射中像数组、切片、Map、指针等类型的变量,它们的.Name()都是返回空。
type myInt int64funcreflectType(x interface{}){
t := reflect.TypeOf(x)
fmt.Printf("type:%v kind:%v\n", t.Name(), t.Kind())}funcmain(){var a *float32// 指针var b myInt // 自定义类型var c rune// 类型别名reflectType(a)// type: kind:ptrreflectType(b)// type:myInt kind:int64reflectType(c)// type:int32 kind:int32type person struct{
name string
age int}type book struct{ title string}var d = person{
name:"zs",
age:18,}var e = book{title:"GO"}reflectType(d)// type:person kind:structreflectType(e)// type:book kind:struct}
ValueOf
isNil()、isValid()
reflect.ValueOf()返回的是reflect.Value类型
reflect.Value与原始值之间可以互相转换。
funcreflectValue(i interface{}){
v := reflect.ValueOf(i)
k := v.Kind()//TypeOf()有Kind()方法
fmt.Printf("%v,%v,%T\n", v, k, k)switch k {case reflect.Float64://v.Float()从反射中获取整型的原始值,然后通过float64()强制转换类型
fmt.Printf("type is float64,value is %f\n",float64(v.Float()))case reflect.Float32://v.Float()从反射中获取整型的原始值,然后通过float32()强制转换类型
fmt.Printf("type is float32,value is %f\n",float32(v.Float()))case reflect.Int64://v.Float()从反射中获取整型的原始值,然后通过int64()强制转换类型
fmt.Printf("type is int64,value is %d\n",int64(v.Int()))case reflect.Int32://v.Float()从反射中获取整型的原始值,然后通过int32()强制转换类型
fmt.Printf("type is int32,value is %d\n",int32(v.Int()))default:
fmt.Println("other type")}}funcmain(){var a float32=3.14var b int64=100reflectValue(a)// type is float32, value is 3.140000reflectValue(b)// type is int64, value is 100}
// 实例化一个匿名结构体
st :=struct{
abc string}{"abc",}// 尝试从结构体中查找"abc"字段
fmt.Println("结构体成员:", reflect.ValueOf(st).FieldByName("abc").IsValid())//true
实现一个通用结构体的sql语句
funccreateQuery(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")}//output:insert into employee values("Naveen", 565, "Coimbatore", 90000, "India")
检测struct类型是包含指定字段
funcHasField(o interface{}, name string)bool{
t := reflect.TypeOf(o)for t.Kind()== reflect.Ptr {
t = t.Elem()}if t.Kind()!= reflect.Struct {returnfalse}_, ok := t.FieldByName(name)return ok
}