竹简文档

函数工具

获取函数名称、方法名称等反射相关的工具函数

函数工具

xUtil.Function() 提供与函数反射相关的工具方法,用于获取函数名称、解析方法名等场景。

import xUtil "github.com/xiaolfeng/bamboo-base-go/common/utility"

入口函数

utility.go
func Function() *pack.Function

获取函数名

GetFunctionName

获取函数的完整名称(包含包路径):

package/function.go
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

获取方法的方法名(不包含包路径和接收者类型):

package/function.go
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 版本不同而有所差异
  • 私有方法同样可以获取名称

下一步

On this page