对Golang中的runtime.Caller使用说明

Olivia ·
更新时间:2024-11-14
· 698 次阅读

如下所示:

func Caller(skip int) (pc uintptr, file string, line int, ok bool)

参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,....

返回值:

pc是uintptr这个返回的是函数指针

file是函数所在文件名目录

line所在行号

ok 是否可以获取到信息

示例:

我们分别打印skip为0-3的相关信息

package main import ( "fmt" "runtime" ) func main() { for i := 0 ; i< 4; i++ { test(i) } } func test(skip int) { call(skip) } func call(skip int) { 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)) }

结果:

4887700 D:/GoProject/src /test/test5.go 19 true main.call 4887585 D:/GoProject/src/ test/test5.go 15 true main.test 4887481 D:/GoProject/src /test/test5.go 10 true main.main 4383501 C:/Go/src/runtime/proc.go 198 true runtime.main 分析结果可以看到

0-3分别上当前函数,当前函数的上一个caller,....

补充:golang打印所有的runtime调用栈

我就废话不多说了,大家还是直接看代码吧~

import "runtime" buf := make([]byte, 1 << 20) runtime.Stack(buf, true) fmt.Printf("\n%s", buf)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持软件开发网。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文章:详解Golang使用MongoDB通用操作Golang 如何判断数组某个元素是否存在(isset)golang获取网卡信息操作golang判断net.Conn 是否已关闭的操作解决golang json解析出现值为空的问题golang 获取字符串长度的案例Golang获取目录下的文件及目录信息操作如何判断Golang接口是否实现的操作详解golang中的method



runtime golang

需要 登录 后方可回复, 如果你还没有账号请 注册新账号