runtime.Caller与runtime.FuncForPC
func Caller(skip int) (pc uintptr, file string, line int, ok bool)
// skip如果是0,返回当前调用Caller函数的函数名、文件、程序指针PC,1是上一层函数,以此类推
package main
import (
"log"
"runtime"
)
func main() {
test()
}
func test() {
test2()
}
func test2() {
// 上2层函数信息
pc, file, line, ok := runtime.Caller(2)
// 是否获取成功
log.Println(ok)
// 函数指针
log.Println(pc)
// 所属文件
log.Println(file)
// 所属行
log.Println(line)
// 获取函数信息
f := runtime.FuncForPC(pc)
// 函数名
log.Println(f.Name())
// 当前函数信息
pc, file, line, ok = runtime.Caller(0)
log.Println(pc)
log.Println(file)
log.Println(line)
log.Println(ok)
f = runtime.FuncForPC(pc)
log.Println(f.Name())
// 上一层函数信息
pc, file, line, ok = runtime.Caller(1)
log.Println(pc)
log.Println(file)
log.Println(line)
log.Println(ok)
f = runtime.FuncForPC(pc)
log.Println(f.Name())
}
直接从函数指针获取函数名称所属文件
package main
import (
"log"
"reflect"
"runtime"
)
type Demo struct {
}
func (this *Demo) Hello() {
}
func main() {
demo := new(Demo)
pc := reflect.ValueOf(demo.Hello).Pointer()
f := runtime.FuncForPC(pc)
log.Println(f.Name())
log.Println(f.FileLine(pc))
}