func TestGetFullName(ot *testing.T) { name := kmgReflect.GetTypeFullName(reflect.TypeOf("")) kmgTest.Equal(name, "string") name = kmgReflect.GetTypeFullName(reflect.TypeOf(1)) kmgTest.Equal(name, "int") name = kmgReflect.GetTypeFullName(reflect.TypeOf(&ta{})) kmgTest.Equal(name, "github.com/bronze1man/kmg/kmgReflect_test.ta") name = kmgReflect.GetTypeFullName(reflect.TypeOf([]string{})) kmgTest.Equal(name, "") }
func stringTransformSubType(in reflect.Value, transformTable map[string]map[string]string) (err error) { switch in.Kind() { case reflect.String: typeName := kmgReflect.GetTypeFullName(in.Type()) thisTable, exist := transformTable[typeName] if !exist { return } inS := in.String() if inS == "" { in.SetString("") return } oVal, exist := thisTable[inS] if !exist { return fmt.Errorf(`string transform fail! from:"%s",type:"%s"`, inS, typeName) } in.SetString(oVal) return case reflect.Ptr: return stringTransformSubType(in.Elem(), transformTable) case reflect.Slice: len := in.Len() for i := 0; i < len; i++ { err = stringTransformSubType(in.Index(i), transformTable) if err != nil { return } } case reflect.Struct: len := in.Type().NumField() for i := 0; i < len; i++ { err = stringTransformSubType(in.Field(i), transformTable) if err != nil { return } } } return }
//注册controller,请先注册后使用,该函数不能并发调用,不能在http开始处理之后再注册(data race问题) // 允许重复注册. func RegisterController(obj interface{}) { v := reflect.ValueOf(obj) t := v.Type() objName := kmgReflect.GetTypeFullName(t) objName = strings.Replace(objName, "/", ".", -1) for i := 0; i < t.NumMethod(); i++ { if t.Method(i).PkgPath != "" { // 不是public不需要注册进来. continue } mv := v.Method(i) mvt := mv.Type() if mvt.AssignableTo(controllerFuncType) { name := objName + "." + t.Method(i).Name //_, ok := controllerObjMap[name] //if ok { // panic(fmt.Errorf("[RegisterController] Repeat register controller name[%s]", name)) //} controllerObjMap[name] = mv.Interface().(func(ctx *kmgHttp.Context)) } } }