получить имя и пакет вызывающей функции - PullRequest
0 голосов
/ 26 октября 2018

Мне нужно знать имя go-пакета и функцию (включая имя получателя) вызывающей функции.

Это мой текущий код:

func retrieveCallInfo() {
    pc, _, _, _ := runtime.Caller(1)

    funcName := runtime.FuncForPC(pc).Name()
    lastDot := strings.LastIndexByte(funcName, '.')

    fmt.Printf("  Package: %s\n", funcName[:lastDot])
    fmt.Printf("  Func:   %s\n", funcName[lastDot+1:])
}

Однако код работает не так, как должен.

// When called from a conventional (free) function:
runtime.FuncForPC(pc).Name() // returns <package-path>.<funcName>

// When called from a method receiver function:
runtime.FuncForPC(pc).Name() // returns <package-path>.<receiverName>.<funcName>

При вызове из функции получателя имя получателя является частью имени пакета, а не имени функции - что не то, что я хочу.

Вот демонстрация: https://play.golang.org/p/-99sZXr4ptD

Во втором примере я хочу, чтобы имя пакета было main, а имя функции - empty.f. Так как точки также являются допустимыми частями имени пакета, я не могу просто разделить другую точку - возможно, это на самом деле не получатель, а часть имени пакета.

Следовательно, информация, возвращаемая runtime.FuncForPC(), неоднозначна и недостаточна.

Как я могу получить правильные результаты?

1 Ответ

0 голосов
/ 26 октября 2018

Результаты верны. Вам нужно будет выполнить некоторый анализ, чтобы отформатировать результаты так, как вы хотите; например, попробуйте разбить точки после последней косой черты в строке:

pc, _, _, _ := runtime.Caller(1)
funcName := runtime.FuncForPC(pc).Name()
lastSlash := strings.LastIndexByte(funcName, '/')
if lastSlash < 0 {
    lastSlash = 0
}
lastDot := strings.LastIndexByte(funcName[lastSlash:], '.') + lastSlash

fmt.Printf("Package: %s\n", funcName[:lastDot])
fmt.Printf("Func:   %s\n", funcName[lastDot+1:])

Детская площадка: https://play.golang.org/p/-Nbos0a1Ifp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...