在golang中获取函数名

在golang中获取函数名,go,decorator,Go,Decorator,我试图在调用函数名前后记录它,如下所示 是否可以在decorator中获取修饰后的函数名f1,使其显示进入f1和离开f1 主程序包 进口( “fmt” ) func f1(){ fmt.Println(“f1”) } func修饰符(f func()){ fmt.Println(“输入f.name”) f() fmt.Println(“留下f.name”) } func main(){ 装饰师(f1) } 您可以使用reflect和runtime包来实现这一点 package main imp

我试图在调用函数名前后记录它,如下所示

是否可以在
decorator
中获取修饰后的函数名
f1
,使其显示
进入f1
离开f1

主程序包
进口(
“fmt”
)
func f1(){
fmt.Println(“f1”)
}
func修饰符(f func()){
fmt.Println(“输入f.name”)
f()
fmt.Println(“留下f.name”)
}
func main(){
装饰师(f1)
}

您可以使用reflect和runtime包来实现这一点

package main

import (
"fmt"
  "reflect"
  "runtime"
)

func f1() {
  fmt.Println("f1")
}

func decorator(f func()) {
  name := runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
  fmt.Printf("entering f.name:%s\n",name)
  f()
  fmt.Printf("leaving f.name:%s\n",name)
}

func main() {
  decorator(f1)
}

标准库不提供从函数值获取字符串名称的方法。有关从函数中输入和退出钩子的简便方法,请参阅。答案记录在退出时。在
timer
函数的开头添加一条print语句以登录enter。请注意,并非所有函数都有名称。并非所有函数都以一种良好的、受支持的、兼容的方式实际工作,也不是以您认为它应该工作的方式工作。请查看
运行时
软件包,也许有什么可以帮助您做到这一点。
entering f.name:main.f1
f1
leaving f.name:main.f1
``