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