在Golang中获取装饰函数的名称

huangapple go评论94阅读模式
英文:

get decorated function name in golang

问题

我正在尝试在调用装饰函数之前和之后记录装饰函数的名称,如下所示。

是否可以在decorator函数中获取装饰函数f1的名称,以便显示为entering f1leaving 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>



huangapple
  • 本文由 发表于 2021年6月7日 11:26:24
  • 转载请务必保留本文链接:https://go.coder-hub.com/67865597.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定