内容包括
1. 用interface{}接收值
2. 判断interface{}的类型 switch
3. 打印interface{}的类型
4. 通过字符串对结构体,interface{}等进行设置值、获取值处理
示例代码
package mainimport ("fmt""log""reflect"
)type Student2 struct {Id1 int `json:"jsonTag1" db:"name2"`Name1 stringage1 int
}func reflectValue(a interface{}) {log.Println("================ reflect value start ==================")// 类型判断switch a.(type) {case float64:log.Println("a type is :", "float64")case float32:log.Println("a type is :", "float32")default:log.Println("a type is :", "default")}// 打印类型aType := reflect.TypeOf(a)log.Println("a type is:", aType)// 获取值aValue := reflect.ValueOf(a)log.Println("a value is :", aValue.Float())// 设置值报错,不传指针就没办法设置值// 报错信息:panic: reflect: reflect.Value.SetFloat using unaddressable value// aValue.SetFloat(32.11)// log.Println("a value is :", aValue.Float())log.Println("================ reflect value end ==================")
}func reflectPoint(a interface{}) {log.Println("================ reflect point start ==================")// 打印类型aType := reflect.TypeOf(a)log.Println("a type is:", aType)// 判断类型aKind := aType.Kind()switch aKind {case reflect.Float64:log.Println("a kind is :", "float64")case reflect.Float32:log.Println("a kind is :", "float32")case reflect.Pointer:log.Println("a kind is :", "Pointer")}// 获取参数aValue := reflect.ValueOf(a)log.Println("a value is :", aValue.Elem().Float())// 设置参数aValue.Elem().SetFloat(32.1)log.Println("a value is :", aValue.Elem().Float())log.Println("================ reflect point end ==================")
}func reflectStructValue(a interface{}) {log.Println("================ reflect struct value start ==================")// 获取类型aType := reflect.TypeOf(a)log.Println("a type of :", aType)log.Println("a type name :", aType.Name())// 获取值{100 name1 13}aValue := reflect.ValueOf(a)log.Println("a value of :", aValue)// 根据名称获取字段// 如果外边传的是value则没法赋值,如果传的是$stu地址 则可以复制name1Filed := aValue.FieldByName("Name1")if name1Filed.Kind() == reflect.String && name1Filed.CanSet() {name1Filed.SetString("name1111111111")}// 遍历属性fieldNum := aType.NumField()for i := 0; i < fieldNum; i++ {field := aType.Field(i)value := aValue.Field(i)// 这里得看属性是否大小写,如果小写没法子获取他的值// panic: reflect.Value.Interface: cannot return value obtained from unexported field or method// 获取字段标记:field.Tag.Get("json")if value.CanInterface() {log.Println("属性:", field.Name, field.Type, value.Interface(), field.Tag.Get("json"))} else {log.Println("属性:", field.Name, field.Type)}}// 遍历方法// func (stu Student2) Say() 可以获取到// func (stu *Student2) Say() aType.NumMethod就没法获取到了methodNum := aType.NumMethod()for i := 0; i < methodNum; i++ {method := aType.Method(i)log.Println("方法:", method.Name, method.Type)}// 根据名称获取方法,并执行sayMethod := aValue.MethodByName("Say")args := []reflect.Value{reflect.ValueOf("message1111")}sayMethod.Call(args)log.Println("================ reflect struct value end ==================")}func reflectStructPoint(a interface{}) {log.Println("================ reflect struct point start ==================")// 获取值{100 name1 13}aValue := reflect.ValueOf(a)log.Println("a value of :", aValue.Elem().Interface())// 根据名称获取字段// 如果外边传的是value则没法赋值,如果传的是$stu地址 则可以复制name1Filed := aValue.Elem().FieldByName("Name1")if name1Filed.Kind() == reflect.String && name1Filed.CanSet() {name1Filed.SetString("name1111111111")}log.Println("a value of :", a)log.Println("a value of :", aValue.Elem().Interface())log.Println("================ reflect struct point start ==================")
}func (stu Student2) Say(message string) {log.Println("student say:", stu, message)
}func main() {log.Println("main ...")var f float64 = 10// 传地址可以修改reflectPoint(&f)// 传值就不能修改reflectValue(f)stu := Student2{100, "name1", 13}stu.Say("1111")reflectStructValue(stu)reflectStructPoint(&stu)fmt.Println("success ...")
}
参考:
https://www.topgoer.com/%E5%B8%B8%E7%94%A8%E6%A0%87%E5%87%86%E5%BA%93/%E5%8F%8D%E5%B0%84.html