github.com/tencent/goom@v1.0.1/reflect.go (about) 1 // Package mocker 定义了 mock 的外层用户使用 API 定义, 2 // 包括函数、方法、接口、未导出函数(或方法的)的 Mocker 的实现。 3 // 当前文件汇聚了公共的工具类,比如类型转换。 4 package mocker 5 6 import ( 7 "reflect" 8 "runtime" 9 ) 10 11 // functionName 获取函数名称 12 func functionName(fnc interface{}) string { 13 return runtime.FuncForPC(reflect.ValueOf(fnc).Pointer()).Name() 14 } 15 16 // typeName 获取类型名称 17 func typeName(fnc interface{}) string { 18 t := reflect.TypeOf(fnc) 19 if t.Kind() == reflect.Ptr { 20 return "*" + t.Elem().Name() 21 } 22 return t.Name() 23 } 24 25 // packageName 获取类型包名 26 func packageName(def interface{}) string { 27 t := reflect.TypeOf(def) 28 if t.Kind() == reflect.Ptr { 29 return t.Elem().PkgPath() 30 } 31 return t.PkgPath() 32 } 33 34 // inTypes 获取类型 35 func inTypes(isMethod bool, funTyp reflect.Type) []reflect.Type { 36 numIn := funTyp.NumIn() 37 skip := 0 38 if isMethod { 39 skip = 1 40 } 41 typeList := make([]reflect.Type, numIn-skip) 42 for i := 0; i < numIn-skip; i++ { 43 typeList[i] = funTyp.In(i + skip) 44 } 45 return typeList 46 } 47 48 // outTypes 获取类型 49 func outTypes(funTyp reflect.Type) []reflect.Type { 50 numOut := funTyp.NumOut() 51 typeList := make([]reflect.Type, numOut) 52 for i := 0; i < numOut; i++ { 53 typeList[i] = funTyp.Out(i) 54 } 55 return typeList 56 }