golang go reflection go-reflect

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