在Golang中使用反射获取函数名称

Las*_*lan 18 reflection go go-reflect

我正在尝试使用Go的反射系统来检索函数的名称,但是在调用其类型的Name方法时我得到一个空字符串.这是预期的行为吗?

这是我如何处理问题的一个简单示例:

package main

import "fmt"
import "reflect"

func main() {
    typ := reflect.TypeOf(main)
    name := typ.Name()
    fmt.Println("Name of function" + name)
}
Run Code Online (Sandbox Code Playgroud)

Son*_*nia 29

package main

import "fmt"
import "runtime"

func main() {
    pc, _, _, _ := runtime.Caller(0)
    fmt.Println("Name of function: " + runtime.FuncForPC(pc).Name())
    fmt.Println()

    // or, define a function for it
    fmt.Println("Name of function: " + funcName())
    x()
}

func funcName() string {
    pc, _, _, _ := runtime.Caller(1)
    return runtime.FuncForPC(pc).Name()
}

func x() {
    fmt.Println("Name of function: " + funcName())
    y()
}

func y() {
    fmt.Println("Name of function: " + funcName())
    z()
}
func z() {
    fmt.Println("Name of function: " + funcName())
}
Run Code Online (Sandbox Code Playgroud)

输出:

功能名称:main.main

函数
名称:main.main
函数
名称:main.x函数名称:main.y函数名称:main.z


Den*_*ret 27

解决方案是使用返回a的FuncForPc*Func.

返回"main.main":

package main

import "fmt"
import "reflect"
import "runtime"


func main() {
    name := runtime.FuncForPC(reflect.ValueOf(main).Pointer()).Name()
    fmt.Println("Name of function : " + name)
}
Run Code Online (Sandbox Code Playgroud)

如果你愿意"main",只需将其标记即可.

  • 或者,没有反射,pc,_,_,_:= runtime.Caller(0)fmt.Println("函数名称:"+ runtime.FuncForPC(pc).Name()) (10认同)