函数工具
获取函数名称、方法名称等反射相关的工具函数
函数工具
xUtil.Function() 提供与函数反射相关的工具方法,用于获取函数名称、解析方法名等场景。
import xUtil "github.com/xiaolfeng/bamboo-base-go/common/utility"入口函数
func Function() *pack.Function获取函数名
GetFunctionName
获取函数的完整名称(包含包路径):
func (f *Function) GetFunctionName(fn interface{}) string该方法通过反射机制获取传入函数的底层指针,并利用 runtime.FuncForPC 查询其运行时信息,从而返回函数的完整标识符。
字段
类型
xUtil.Function().GetFunctionName(myFunc) // "main.myFunc"
xUtil.Function().GetFunctionName(http.Get) // "net/http.Get"
xUtil.Function().GetFunctionName(42) // ""(非函数类型)
xUtil.Function().GetFunctionName(nil) // ""(nil 输入)完整示例
package main
import (
"fmt"
xUtil "github.com/xiaolfeng/bamboo-base-go/common/utility"
)
func myFunction() {}
func main() {
name := xUtil.Function().GetFunctionName(myFunction)
fmt.Println(name) // "main.myFunction"
// 匿名函数
closure := func() {}
closureName := xUtil.Function().GetFunctionName(closure)
fmt.Println(closureName) // 包含 "func" 字样的特殊格式
}获取方法名
GetMethodName
获取方法的方法名(不包含包路径和接收者类型):
func (f *Function) GetMethodName(method interface{}) string该方法通过反射获取传入方法的运行时信息,并对其完整名称进行解析处理。它会去除包路径、接收者类型(如 (*Receiver) 或 Receiver)以及闭包方法特有的 -fm 后缀,仅返回纯粹的方法名称字符串。
字段
类型
type UserService struct{}
func (s *UserService) GetUser() {}
func (s *UserService) DeleteUser() {}
func main() {
service := &UserService{}
xUtil.Function().GetMethodName(service.GetUser) // "GetUser"
xUtil.Function().GetMethodName(service.DeleteUser) // "DeleteUser"
}完整示例
package main
import (
"fmt"
xUtil "github.com/xiaolfeng/bamboo-base-go/common/utility"
)
type Handler struct{}
func (h *Handler) HandleRequest() {}
func (h *Handler) validateInput() {}
func main() {
handler := &Handler{}
name := xUtil.Function().GetMethodName(handler.HandleRequest)
fmt.Println(name) // "HandleRequest"
// 私有方法同样适用
privateName := xUtil.Function().GetMethodName(handler.validateInput)
fmt.Println(privateName) // "validateInput"
}使用场景
日志记录
在日志中记录当前调用的方法名,便于调试和追踪:
func (s *UserService) CreateUser(ctx *gin.Context, req *CreateUserReq) {
// 记录当前方法名
methodName := xUtil.Function().GetMethodName(s.CreateUser)
s.logger.Info(fmt.Sprintf("[%s] 开始创建用户", methodName))
// 业务逻辑...
}中间件追踪
在中间件中自动获取 Handler 方法名用于监控:
func TraceMiddleware() gin.HandlerFunc {
return func(ctx *gin.Context) {
// 获取 Handler 方法名(需要特殊处理)
// 可以在 Handler 中注入方法名用于追踪
ctx.Next()
}
}注意事项
GetMethodName 方法不会验证传入参数是否为有效的方法,若传入非法参数可能会导致意外结果。
- 对于非函数类型的输入,
GetFunctionName会返回空字符串 - 匿名函数(闭包)的名称格式可能因 Go 版本不同而有所差异
- 私有方法同样可以获取名称