首页 > 其他分享 >golang runtime.Caller 获取调用堆栈信息, Caller(1) 和 Caller(2) 的区别

golang runtime.Caller 获取调用堆栈信息, Caller(1) 和 Caller(2) 的区别

时间:2024-06-22 13:42:59浏览次数:7  
标签:调用 函数 Caller 信息 golang 堆栈 runtime

 

func whoCalledMe() {
    // 获取调用堆栈信息
    _, fileName, lineNo, ok := runtime.Caller(2)
    if !ok {
        fmt.Println("Failed to get caller information")
        return
    }
    fmt.Printf("Called from: %s:%d\n", fileName, lineNo)
}

 

runtime.Caller 函数用于获取调用堆栈信息。它接受一个参数,表示要上溯的栈帧数(skip),并返回对应的调用信息,包括程序计数器(pc)、文件名(file)和行号(line)。

runtime.Caller 函数的参数决定了它回溯调用堆栈的深度。这里的区别在于:

  • runtime.Caller(1):当在函数中调用 runtime.Caller(1) 时,它会返回调用 Caller 函数的函数的堆栈信息。换句话说,它跳过了当前函数这一层,直接获取调用当前函数的那个函数的上下文。这在记录日志、调试信息时非常有用,可以让你知道是哪个函数触发了当前的调用。

  • runtime.Caller(2):而使用 runtime.Caller(2) 则会进一步上溯一层堆栈。这意味着它不仅跳过了当前函数,还跳过了直接调用当前函数的那一层,返回的是调用当前函数的那个函数的调用者的信息。这对于需要了解更深层次调用链的场景很有帮助

总结来说,runtime.Caller(1) 和 runtime.Caller(2) 的主要区别在于它们获取的调用堆栈层级不同,分别对应直接调用当前函数的函数信息和调用当前函数的函数的调用者的信息。

 

Link:https://www.cnblogs.com/farwish/p/18261766

标签:调用,函数,Caller,信息,golang,堆栈,runtime
From: https://www.cnblogs.com/farwish/p/18261766

相关文章

  • golang openai GPT4o 示例代码
    packagemainimport( "context" "errors" "fmt" "io" "log" "os" "github.com/joho/godotenv" openai"github.com/sashabaranov/go-openai")funcmain(){ err:=godoten......
  • Golang并发
    Sync.MutexMutex结构typeMutexstruct{ stateint32 semauint32}Sync.Mutex由两个字段构成,state用来表示当前互斥锁处于的状态,sema用于控制锁状态的信号量互斥锁state(32bit)主要记录了如下四种状态:waiter_num(29bit):记录了当前等待这个锁的goroutine数量starving(......
  • golang interface guard 技术(接口守护)
     Go代码的接口守卫(interfaceguards)技术,通常用于库的开发,以确保类型符合预期的接口。 下面示例的Interfaceguards确保App类型实现了caddy.App、caddy.Provisioner和caddy.Validator接口。具体来说,它通过将(*App)(nil)转换为这三个接口的类型,并将其赋值给匿名变量......
  • golang 爬虫修炼02 ---协程、互斥锁、读写锁、waitgroup
    协程程序:为了完成特定任务,使用某种语言编写的一组指令的集合,是一段静态的代码进程:是程序的一次执行过程。正在运行的一个程序,进程作为资源分配的单位,在内存中会为每个进程分配不同的内存区域。进程是动态的,有产生、存在、消亡的过程线程:进程可进一步细分为线程,是一个程序......
  • 好消息,飞桨统一底层Paddle.Runtime.win_x64包发布
         好消息,飞桨统一底层Paddle.Runtime.win_x64包发布,该包包括提速15%以及内存泄漏问题的优化。本包为飞桨框架CPU版通用运行时包,仅适用于windows平台。当前发布版本为2.6.1,为百度飞桨Paddle库的C++版本的优化版。自带C++运行时,win10,win11,以及winserver2014以上均​绿色......
  • Golang - 90天从新手到大师
    开篇最近有很多小伙伴都在寻找go语言完整学习资料,我整理了一些Golang方面的知识,方便大家学习。内容从最基础的入门到项目设计,希望帮助更多想了解和学习Go语言的伙伴。因为是持续创作,所以也会持续更新。有些章节目录还没有内容,敬请期待。。创作不易,感谢大家的支持。如果看后......
  • 关于RuntimeException与事务
    1.spring的默认回滚策略当采用@Transactional注解方法抛出RuntimeException时,spring会默认回滚事务对于检查型异常(即不是RuntimeException子类或其子类),spring默认不会回滚,除非明确指定@Transactional(rollbackFor=MyException.class)2.简化代码:使用运行时异常不再需要为每一......
  • 【golang学习之旅】Go程序快速开始 & Go程序开发的基本注意事项
    系列文章【golang学习之旅】使用VScode安装配置Go开发环境【golang学习之旅】报错:adeclaredbutnotused【golang学习之旅】Go的基本数据类型【golang学习之旅】深入理解字符串string数据类型【golang学习之旅】gomodtidy【golang学习之旅】记录一次paniccase......
  • golang json库 忽略 omitempty
    json库的obmitempty介绍众所周知,golang的json库有个omitempty的tag,有了它,这个json序列化的时候,如果这个字段是零值,则会忽略此字段的序列化,导致json字符串中没有对应的字符串。这对于某些人是困惑的,一般默认是没有omitempty这个tag的,但是。但是来了,但是protobuf生成的pb.......
  • Golang与设计模式
    单例模式因为之前研究Java比较多,所以当我试着使用go来实现一些设计模式的时候,首先想到的就是照搬Java中的思路,后面对go了解加深之后又增加了一些新的思路。在Java中实现的单例模式的思路有很多,但是比较好的两个思路是利用类加载机制生成单例对象,check-lock-check机制避免并发问......