web-dev-qa-db-fra.com

Comment obtenir le nom d'une fonction dans Go?

Étant donné une fonction, est-il possible d'obtenir son nom? Dire:

func foo() {
}

func GetFunctionName(i interface{}) string {
    // ...
}

func main() {
    // Will print "name: foo"
    fmt.Println("name:", GetFunctionName(foo))
}

On m'a dit que runtime.FuncForPC aiderait, mais je n'ai pas compris comment l'utiliser.

87
moraes

Désolé d'avoir répondu à ma propre question, mais j'ai trouvé une solution:

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))
}
147
moraes

Pas exactement ce que vous voulez, car il enregistre le nom de fichier et le numéro de ligne, mais voici comment je le fais dans ma bibliothèque Tideland Common Go ( http://tideland-cgl.googlecode.com/ ) en utilisant le package "runtime":

// Debug prints a debug information to the log with file and line.
func Debug(format string, a ...interface{}) {
    _, file, line, _ := runtime.Caller(1)
    info := fmt.Sprintf(format, a...)

    log.Printf("[cgl] debug %s:%d %v", file, line, info)
7
themue