runtime.Caller
函数定义
func runtime.Caller(skip int) (pc uintptr, file string, line int, ok bool)
作用
获取函数Caller
的调用信息
参数
skip=0时
: 返回调用Caller的函数A的pc(program counter)(A即runtime.Caller代码当前所在函数)、所在文件名以及Caller在函数A中的行数
skip=1时
: 返回调用函数A的函数B的pc、所在文件名以及函数A在函数B中的行数;以此类推
pc
: 程序计数器,指向下一条将要取指的指令地址
file
: pc对应的函数所在文件路径
line
: 被调用方在pc对应的函数中的行数
示例:
/Users/go/src/liyouming/golang-trick/40-clean-code-controll-flow/util/util.go
package util
import (
"bytes"
"fmt"
"runtime"
)
func CallerTest() {
for i := 0; i <= 4; i++ {
pc, file, line, ok := runtime.Caller(i)
if ok {
fmt.Printf("当i:=%d时:\n调用者的pc:%v\n调用者的函数名:%s\n"+
"调用者所在file:%s\n被调用者在调用者中的line:%d\n", i, pc, runtime.FuncForPC(pc).Name(), file, line)
fmt.Println(string(bytes.Repeat([]byte("*"), 10)))
}
}
}
main.go
package main
import (
"golang-trick/40-clean-code-controll-flow/util"
)
func main() {
util.CallerTest()
}
运行结果如下:
当i:=0时:
调用者的pc:17363077
调用者的函数名:golang-trick/40-clean-code-controll-flow/util.CallerTest
调用者所在file:/Users/go/src/liyouming/golang-trick/40-clean-code-controll-flow/util/util.go
被调用者在调用者中的line:11
**********
当i:=1时:
调用者的pc:17363702
调用者的函数名:main.main
调用者所在file:/Users/go/src/liyouming/golang-trick/40-clean-code-controll-flow/main.go
被调用者在调用者中的line:8
**********
当i:=2时:
调用者的pc:16987729
调用者的函数名:runtime.main
调用者所在file:/usr/local/opt/go/libexec/src/runtime/proc.go
被调用者在调用者中的line:250
**********
当i:=3时:
调用者的pc:17158656
调用者的函数名:runtime.goexit
调用者所在file:/usr/local/opt/go/libexec/src/runtime/asm_amd64.s
被调用者在调用者中的line:1594
**********