在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
``