funcmain() { var a *float32//指针 var b myInt //自定义类型 var c rune//类型别名 reflectType(a) //type: kind:prt reflectType(b) //type:myInt kind:int64 reflectType(c) //type:int32 kind:int32 reflectType(d)//type:person kind:struct reflectType(e)//type:book kind:struct }
funcreflectValue(x interface{}) { v := reflect.ValueOf(x) k := v.Kind() switch k { case reflect.Int64: //v.Int()从反射中获取整形的原始值,然后通过int64()强制转换类型 fmt.Printf("type is int64, value is %d\n", v.Int()) case reflect.Float32: //v.Float()从反射中获取整形的原始值,然后通过float32()强制转换类型 fmt.Printf("type is float32, value is %f\n", float32(v.Float())) case reflect.Float64: //v.Float()从反射中获取整形的原始值,然后通过float64()强制转换类型 fmt.Printf("type is float64, value is %f\n", float64(v.Float()))
} }
funcmain() { var a float32 = 3.14 var b float64 = 100 reflectValue(a) //type is float32, value is 3.140000 reflectValue(b) //type is float64, value is 100.000000 //将int类型的原始值类型转换为reflect.Value类型 c := reflect.ValueOf(10) fmt.Printf("type c: %T\n", c) //type c: reflect.Value }
funcmain() { var a int64 = 100 //reflectSetValue1(a) // panic: reflect: reflect.flag.mustBeAssignable using unaddressable value reflectSetValue2(&a) fmt.Println(a) }
type StructField struct { // Name是字段的名字。PkgPath是非导出字段的包路径,对导出字段该字段为""。 // 参见http://golang.org/ref/spec#Uniqueness_of_identifiers Name string PkgPath string Type Type // 字段的类型 Tag StructTag // 字段的标签 Offset uintptr// 字段在结构体中的字节偏移量 Index []int// 用于Type.FieldByIndex时的索引切片 Anonymous bool// 是否匿名字段 }
反射获取属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
type Person struct { Name string`json:"name"` Age int`json:"age"` Tel string`json:"tel"` Hobby []string`json:"hobby"` }
funcNewPerson(name string, age int, tel string, hobby []string) *Person { return &Person{Name: name, Age: age, Tel: tel, Hobby: hobby} }