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  }