英文:
get decorated function name in golang
问题
我正在尝试在调用装饰函数之前和之后记录装饰函数的名称,如下所示。
是否可以在decorator
函数中获取装饰函数f1
的名称,以便显示为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)
}
英文:
I am trying to log decorated function name before and after calling it as below.
Is it possible to get the decorated function name f1
in decorator
to make it shows entering f1
and 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)
}
答案1
得分: 3
你可以使用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("进入 f.name:%s\n", name)
f()
fmt.Printf("离开 f.name:%s\n", name)
}
func main() {
decorator(f1)
}
进入 f.name:main.f1
f1
离开 f.name:main.f1
英文:
you can use the reflect and runtime package for that
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
``
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论