NumMethod() 返回类型导出方法数,含嵌入类型方法;Methods() 返回完整方法信息,含名称、签名等细节,索引从0到NumMethod()-1。
Go 语言的 reflect 包允许你在运行时检查任意类型的结构、字段和方法。要动态获取一个类型(尤其是接口或具体结构体)上定义的方法数量,关键在于使用 reflect.Type.Methods() 或 reflect.Type.NumMethod() —— 后者更轻量、更高效。
NumMethod() 快速获取方法总数这是最直接的方式:它返回该类型导出(public)方法的数量,不涉及反射调用,性能好,适合做静态检查。
*os.File 实现的 io.Reader 接口,可查接口本身声明的方法数示例:
func countMethods(v interface{}) int {
od()Methods() 获取完整方法信息当你不仅要知道数量,还想了解每个方法的名称、签名、是否导出、是否是接收指针等细节时,用 Method(i) 遍历。
reflect.Method 结构,含 Name、Type(函数类型)、PkgPath(为空表示导出)、Func(可调用的反射函数值)Method(i) 的索引从 0 开始,最多到 NumMethod()-1
reflect.TypeOf 可能结果不同:例如 reflect.TypeOf(T{}) 和 reflect.TypeOf(&T{}) 的方法集可能不一致(尤其当某些方法只定义在指针接收器上时)示例(打印所有方法名):
t := reflect.TypeOf((*strings.Builder)(nil)).Elem() // 获取 Builder 值类型Go 中方法集规则会影响 reflect 的结果:
T 类型的方法集 = 所有值接收器方法*T 类型的方法集 = 所有值接收器 + 所有指针接收器方法reflect.TypeOf(T{}).NumMethod() ≤ reflect.TypeOf(&T{}).NumMethod()
var _ io.Writer = &T{}),应使用指针类型做反射分析对任意接口类型(包括自定义接口),可直接用 reflect.TypeOf((*YourInterface)(nil)).Elem().NumMethod() 获取其声明的方法数。
reflect.TypeOf(nil)(会 panic),必须用带类型标注的 nil 指针error 接口的方法数:reflect.TypeOf((*error)(nil)).Elem().NumMethod() → 返回 1(即 Error() string)