Obtener el nombre de la función mediante la reflexión en Golang
golang json struct tags (3)
La solución es usar FuncForPc que devuelve un *Func
.
Esto devuelve "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)
}
Si quieres "main"
, simplemente tokenize.
Estoy tratando de usar el sistema de reflexión de Go para recuperar el nombre de una función, pero obtengo una cadena vacía al llamar al método Name en su tipo. ¿Es este el comportamiento esperado?
Este es un ejemplo simple de cómo enfoco el problema:
package main
import "fmt"
import "reflect"
func main() {
typ := reflect.TypeOf(main)
name := typ.Name()
fmt.Println("Name of function" + name)
}
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
}
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())
}
Salida:
Nombre de la función: main.main
Nombre de la función: main.main
Nombre de la función: main.x
Nombre de la función: main.y
Nombre de la función: main.z