go 反射 interface{} 判断类型 获取值 设置值 指针才可以设置值
内容包括1. 用interface{}接收值2. 判断interface{}的类型 switch3. 打印interface{}的类型4. 通过字符串对结构体interface{}等进行设置值、获取值处理示例代码package main import ( fmt log reflect ) type Student2 struct { Id1 int json:jsonTag1 db:name2 Name1 string age1 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