Мне нужно знать имя 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()
, неоднозначна и недостаточна.
Как я могу получить правильные результаты?