Go中可通过reflect包获取函数类型信息:用reflect.TypeOf(f).In(i)和.Out(i)遍历参数与返回值,t.IsVariadic()识别变参,t.Elem()获取变参元素类型,命名返回名不可见但类型准确。
在 Go 中,可以通过 reflect 包获取函数的类型信息,包括参数个数、类型、是否为变参,以及返回值个数和类型。核心是使用 reflect.TypeOf(func).In(i) 和 reflect.TypeOf(func).Out(i)。
反射操作前必须确保传入的是函数值(而非函数调用结果),且需用 reflect.TypeOf 获取其类型。Go 的函数类型属于 reflect.Func 种类,可通过 Kind() 验证:
myFunc),不能传 myFunc()
reflect.TypeOf(f).Kind() == reflect.Func 是安全判断reflect.TypeOf(nil) 返回 nil,需提前判空使用 t.In(i) 获取第 i 个参数类型(i 从 0 开始),参数总数由 t.NumIn() 返回。变参会被表示为切片类型,但可通过 t.IsVariadic() 单独识别:
t.NumIn() 返回所有参数个数(含变参占位符)t.IsVariadic() 为 true 表示最后一个参数是变参t.In(t.NumIn()-1) 返回类似 []int 的切片类型paramType.Elem() 获取变参元素类型(如 []string → string)返回值通过 t.Out(i) 获取,总数由 t.NumOut() 给出。Go 不在类型系统中保留返回值名称,因此反射无法得知命名返回名,但能准确反映类型结构:
func() (int, error))会返回两个类型:int 和 error
func() (x int, e error)),反射结果完全一致,无额外信息rt.String() 或 rt.Kind() 判断是否为 reflect.Interface 类型(如 error)以下代码可打印任意函数的完整签名(参数 + 返回值):
func PrintFuncSignature(f interface{}) {