Go语言如何列出对象方法?是否有类似Python dir()的内置函数?
在Go语言中列出对象方法的实现方式
嘿,好问题!Go语言确实没有像Python里dir()那样直接开箱即用的内置函数来列出对象方法,但我们可以借助标准库的reflect(反射)包来实现几乎一样的功能,甚至能做得更细致。
基本实现:用反射获取方法列表
下面是一个简单的示例,展示如何获取一个结构体的所有方法,包括值接收者和指针接收者的方法:
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func (p Person) SayHello() { fmt.Printf("Hello, I'm %s\n", p.Name) } func (p *Person) GrowOlder() { p.Age++ } func main() { p := Person{Name: "Alice", Age: 30} // 获取值类型对象的反射类型,只能拿到*值接收者*的方法 valType := reflect.TypeOf(p) fmt.Println("值接收者方法:") for i := 0; i < valType.NumMethod(); i++ { method := valType.Method(i) fmt.Printf(" ✅ %s | 签名:%s\n", method.Name, method.Type) } // 获取指针类型的反射类型,能拿到所有方法(*值接收者*+*指针接收者*) ptrType := reflect.TypeOf(&p) fmt.Println("\n所有方法(值+指针接收者):") for i := 0; i < ptrType.NumMethod(); i++ { method := ptrType.Method(i) fmt.Printf(" ✅ %s | 签名:%s\n", method.Name, method.Type) } }
关键细节说明
- 接收者类型的区别:值类型的反射对象只能获取值接收者的方法,而指针类型的反射对象可以同时获取值接收者和指针接收者的方法(Go会自动处理值到指针的转换)。
- 方法元数据:通过
Method(i)可以拿到方法的名称(Name)和完整类型签名(Type),你还可以进一步解析签名里的参数、返回值等信息。
进阶:区分值/指针接收者
如果需要明确区分方法的接收者是值类型还是指针类型,可以检查方法类型的第一个参数(因为方法的第一个参数永远是接收者):
// 以某个method为例 recvType := method.Type.In(0) if recvType.Kind() == reflect.Ptr { fmt.Println(" 🔹 接收者是指针类型") } else { fmt.Println(" 🔹 接收者是值类型") }
注意事项
要提醒你的是,反射虽然好用,但Go官方并不鼓励在生产代码中过度依赖它:
- 反射会带来一定的性能开销,比直接调用方法慢不少;
- 反射会绕过Go的编译期类型检查,容易写出难以调试和维护的代码;
- 除非是调试工具、序列化库这类必须用到反射的场景,否则优先考虑静态类型的解决方案。
内容的提问来源于stack exchange,提问作者RoT
相关产品推荐
相关产品推荐

