2011-08-13 13 views

Respuesta

95

Perdón por responder mi propia pregunta, pero encontré una solución:

package main 

import (
    "fmt" 
    "reflect" 
    "runtime" 
) 

func foo() { 
} 

func GetFunctionName(i interface{}) string { 
    return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name() 
} 

func main() { 
    // This will print "name: main.foo" 
    fmt.Println("name:", GetFunctionName(foo)) 
} 
+0

Si bien esto parece funcionar, es posible que se requiera algo de cuidado aquí: la documentación para .Pointer() indica "Si v's Kind es Func, el puntero devuelto es un puntero de código subyacente, pero no necesariamente suficiente para identificar una función única. La única garantía es que el resultado es cero si y solo si v es un valor cero de func ". – jochen

+0

@jochen does "not an single func" significa que podría devolver falsos positivos (es decir, el puntero de una función diferente)? – themihai

+0

@themihai No sé, la oración que cité es todos los documentos en https://golang.org/pkg/reflect/#Value.Pointer sobre esto. Pero la cita parece indicar que uno podría obtener el mismo puntero para diferentes funciones, ¿no es así? Y si este es el caso, 'GetFunctionName' podría devolver el mismo nombre para diferentes funciones? – jochen

5

No es exactamente lo que quiere, ya que registra el nombre de archivo y el número de línea, pero aquí es cómo lo hago en mi Tideland Biblioteca Ir Común (http://tideland-cgl.googlecode.com/) utilizando el paquete de "tiempo de ejecución":

+0

Eso realmente no ayuda. No necesito obtener información sobre la pila de llamadas, sino sobre una función dada. Creo que la pregunta sería respondida si supiera cómo obtener la pc correspondiente con una referencia de función (si es posible). – moraes

Cuestiones relacionadas