有时候在Go的函数调用的过程当中,咱们须要知道函数被谁调用,好比打印日志信息等。例以下面的函数,咱们但愿在日志中打印出调用者的名字。函数
1func Foo() {
2 fmt.Println("谁在调用我?")
3 bar()
4}
5func Bar() {
6 fmt.Println("谁又在调用我?")
7}
首先打印函数自己的名称编码
最简单的方式就是硬编码。 由于在编译以前,咱们确定知道打印的时候所在哪一个函数,可是更好的方式是编写一个通用的函数,好比下面的例子:spa
1package main
2import (
3 "fmt"
4 "runtime"
5)
6func main() {
7 Foo()
8}
9func Foo() {
10 fmt.Printf("我是 %s, 谁在调用我?\n", printMyName())
11 Bar()
12}
13func Bar() {
14 fmt.Printf("我是 %s, 谁又在调用我?\n", printMyName())
15}
16func printMyName() string {
17 pc, _, _, _ := runtime.Caller(1)
18 return runtime.FuncForPC(pc).Name()
19}
输出结果:日志