代码拉取完成,页面将自动刷新
package reflectx
import (
"reflect"
)
func WalkStructField(ptr interface{}, f func(field reflect.StructField, value reflect.Value) error, excludePrivateField bool) error {
t := reflect.TypeOf(ptr).Elem()
v := reflect.ValueOf(ptr).Elem()
return WalkStructFieldV3(t, v, f, excludePrivateField)
//for i := 0; i < v.NumField(); i++ {
// if !excludePrivateField {
// if err := f(t.Field(i), v.Field(i)); err != nil {
// return err
// }
// } else if excludePrivateField && isPublicField(v.Field(i)) {
// if err := f(t.Field(i), v.Field(i)); err != nil {
// return err
// }
// }
//}
//return nil
}
func WalkStructFieldV3(t reflect.Type, v reflect.Value, f func(field reflect.StructField, value reflect.Value) error, excludePrivateField bool) error {
for i := 0; i < t.NumField(); i++ {
if !excludePrivateField {
if err := f(t.Field(i), v.Field(i)); err != nil {
return err
}
} else if excludePrivateField && isPublicField(v.Field(i)) {
if err := f(t.Field(i), v.Field(i)); err != nil {
return err
}
}
}
return nil
}
func isPublicField(field reflect.Value) bool {
return field.CanSet()
}
func TryCallMethod(b interface{}, methodName string, args ...interface{}) []reflect.Value {
inputs := make([]reflect.Value, len(args))
for i := range args {
inputs[i] = reflect.ValueOf(args[i])
}
handleMethod := reflect.ValueOf(b).MethodByName(methodName)
if handleMethod.IsValid() {
values := handleMethod.Call(inputs)
return values
}
return nil
}
func IsImplement(child interface{}, parent interface{}) bool {
return reflect.TypeOf(child).Implements(reflect.TypeOf(parent).Elem())
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。