Как получить имя функции в Go? - PullRequest
84 голосов
/ 13 августа 2011

Учитывая функцию, возможно ли получить ее имя?Скажите:

func foo() {
}

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

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

Мне сказали, что runtime.FuncForPC поможет, но я не понял, как его использовать.

Ответы [ 2 ]

140 голосов
/ 14 августа 2011

Извините за ответ на свой вопрос, но я нашел решение:

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))
}
8 голосов
/ 14 августа 2011

Не совсем то, что вы хотите, потому что в нем записывается имя файла и номер строки, но вот как я это делаю в моей библиотеке Tideland Common Go (http://tideland -cgl.googlecode.com / ) используя пакет "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)
...