Get name of function using reflection

前端 未结 3 1786
孤街浪徒
孤街浪徒 2020-12-25 14:06

I\'m trying to use Go\'s reflection system to retrieve the name of a function but I get an empty string when calling the Name method on its type. Is this the expected behavi

相关标签:
3条回答
  • 2020-12-25 14:11
    import runtime
    
    func funcName() string {
        pc, _, _, _ := runtime.Caller(1)
        nameFull := runtime.FuncForPC(pc).Name()    // main.foo
        nameEnd := filepath.Ext(nameFull)           // .foo
        name := strings.TrimPrefix(nameEnd, ".")    // foo
        return name
    }
    
    0 讨论(0)
  • 2020-12-25 14:17

    The solution is to use FuncForPc which returns a *Func.

    This returns "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)
    }
    

    If you want "main", just tokenize it.

    0 讨论(0)
  • 2020-12-25 14:31
    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())
    }
    

    Output:

    Name of function: main.main

    Name of function: main.main
    Name of function: main.x
    Name of function: main.y
    Name of function: main.z

    0 讨论(0)
提交回复
热议问题