You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:54:37