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