对Golang中的runtime.Caller使用说明
如下所示:
funcCaller(skipint)(pcuintptr,filestring,lineint,okbool)
参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,....
返回值:
pc是uintptr这个返回的是函数指针
file是函数所在文件名目录
line所在行号
ok是否可以获取到信息
示例:
我们分别打印skip为0-3的相关信息
packagemain
import(
"fmt"
"runtime"
)
funcmain(){
fori:=0;i<4;i++{
test(i)
}
}
functest(skipint){
call(skip)
}
funccall(skipint){
pc,file,line,ok:=runtime.Caller(skip)
pcName:=runtime.FuncForPC(pc).Name()//获取函数名
fmt.Println(fmt.Sprintf("%v%s%d%t%s",pc,file,line,ok,pcName))
}
结果:
4887700D:/GoProject/src/test/test5.go19truemain.call 4887585D:/GoProject/src/test/test5.go15truemain.test 4887481D:/GoProject/src/test/test5.go10truemain.main 4383501C:/Go/src/runtime/proc.go198trueruntime.main
分析结果可以看到
0-3分别上当前函数,当前函数的上一个caller,....
补充:golang打印所有的runtime调用栈
我就废话不多说了,大家还是直接看代码吧~
import"runtime"
buf:=make([]byte,1<<20)
runtime.Stack(buf,true)
fmt.Printf("\n%s",buf)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。