问题描述
是否可以在 f1
中获取修饰函数名称 decorator
以使其显示 entering f1
和 leaving f1
。
package main
import (
"fmt"
)
func f1() {
fmt.Println("f1")
}
func decorator(f func()) {
fmt.Println("entering f.name")
f()
fmt.Println("leaving f.name")
}
func main() {
decorator(f1)
}
解决方法
您可以为此使用反射和运行时包
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)
}
entering f.name:main.f1
f1
leaving f.name:main.f1
``