golang 的runtime库,提供Caller函数,可以返回运行时正在执行的文件名和行号:
函数定义:
func Caller(skip int) (pc uintptr, file string, line int, ok bool) {}
函数用法:
_, file, line, ok := runtime.Caller(0)

package main
import ("fmt";"runtime")func main() {funcName,file,line,ok := runtime.Caller(0)if(ok){fmt.Println("func name: " + runtime.FuncForPC(funcName).Name())fmt.Printf("file: %s, line: %d\n",file,line)}
}

==================================

runtime.Caller 学习笔记

今天阅读log的源码的时候发现他会去调用runtime.Caller 获取文件名称跟行数好奇心就来了,java或者其他语言的开发中log打印文件名称跟行数是一种很正常的事,具体怎么实现的一直没有研究过。今天就研究下golang中是怎么实现的

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

这是函数详情,更深入的详情你可以自己查询go的源码

func main() {call()
}func call() {var calldepth = 1;fmt.Println(runtime.Caller(calldepth))
}

写了一个很简单的测试函数开始学习。一开始不是太懂他的参数的skip是什么意思,多看了下log的源码发现这个的意思是层级的意思。经过多次测试发现层级从0开始到3的时候结束。

17356603 /Users/mac-mini/go/src/demo/3/demo2.go 14 true
17356511 /Users/mac-mini/go/src/demo/3/demo2.go 9 true
16939329 /usr/local/go/src/runtime/proc.go 198 true
17095168 /usr/local/go/src/runtime/asm_amd64.s 2361 true

结果一目了然,层次为0的时候返回我们调用runtime.Caller的地方.为1的时候就是我们调用call函数的地方。 2跟3已经是go源码的调用了应该是用不到。

本来写完了都已经发布了,后来阅读了下runtime.Caller的源码发现这货底层是能获取到调用函数名称的,可是他不返回。

_, frame, _ := stackExpander.next(callers, true)
pc = frame.PC
file = frame.File
line = frame.Line

这个是Caller源码的最后几行,他这里获取了一个frame从中取到了pc,file,line。当我翻阅Frame的struct后发现有个string类型名称为Function属性,打开下断点发现值是真的有正确。emmm具体的不知道google是怎么设计的,不过应该是的有他们的道理吧。

golang 打印函数名/文件名/行号 Callers相关推荐

  1. Go打印函数名/文件名/行号

    package main import ("fmt";"runtime")/* golang 的runtime库,提供Caller函数,可以返回运行时正在执行的 ...

  2. python获取代码当前行数_Python实验室一段日志代码,获取当前调用的函数名和行号...

    代码如下: #............. class CrawlerLog(object): def __init__(self, logName=None): #............ self. ...

  3. 【Qt】qt打印文件名、函数名、行号

    #include <QDebug> #define MyDebug qDebug()<<"[FILE:"<<__FILE__<<&q ...

  4. linux c 中 当前函数名 文件名 可变参 不定参 宏使用

    在linux编程中,当文件数量变的众多之后,使用gdb调试就是一场灾难.因此在程序中加入合理的打印信息,定位错误出现的文件名,函数名,行号等信息,能更高效的定位到问题的所在. 下面定义了宏,分别是WA ...

  5. java获取文件名方法,利用Java获取文件名、类名、方法名和行号的方法小结

    大家都知道,在C语言中,我们可以通过宏FILE. __LINE__来获取文件名和行号,而在Java语言中,则可以通过StackTraceElement类来获取文件名.类名.方法名.行号,具体代码如下: ...

  6. c打印行号和函数_使用C中的函数名称,行号从任何函数打印错误消息

    c打印行号和函数 Sometimes, it is necessary to print some message on logic failure or anytime with the funct ...

  7. linux打印函数名,linux kernel 打印函数指针对应的函数名方法

    linux kernel 打印函数指针对应的函数名方法 内核中函数指针用的很多,在debug 的时候能直接打印出一个函数指针对应的函数就会很方便. 打印裸指针(raw pointer)用 %p,%p除 ...

  8. java获取当前运行代码的类名、方法名、行号

    1.获取当前运行代码的类名,方法名,行号,主要是通过java.lang.StackTraceElement类 2. [1]获得调用者的方法名, 同new Throwable String _metho ...

  9. Go 学习笔记(54)— Go 第三方库之 uber-go/zap/lumberjack(记录日志到文件、支持自动分割日志、支持日志级别、打印调用文件、函数和行号)

    1. 简要说明 zap 是 uber 开源的 Go 高性能日志库,支持不同的日志级别, 能够打印基本信息等,但不支持日志的分割,这里我们可以使用 lumberjack 也是 zap 官方推荐用于日志分 ...

最新文章

  1. 第五篇:并发控制-隔离
  2. 阿里代码规范插件 中文使用手册 FOR Eclipse
  3. HokeyPokey — WWDC讲师特供XCode插件高仿版的设计与实现
  4. Spring Boot配置多数据源
  5. SAP Cloud for Customer里根据External Reference搜索销售订单
  6. mysql 单表字段多少合适_复制信息记录表|全方位认识 mysql 系统库
  7. 解决NHibernate 中与 SQL2005 关键字有冲突的问题
  8. Java讲课笔记13:类的继承
  9. 利用Python分析羊车门问题
  10. 七、MySQL中的字符集 - 系统的撸一遍MySQL
  11. 呼叫中心几种常见质检方式的对比
  12. 计算机英语吕,吕的英语_我姓吕托福注册姓名的英文姓是写LYU还是LV还是LU我的护照上写的是LYU_淘题吧...
  13. 移动终端基础数据管理系统
  14. 软考高级的信息系统项目管理师零基础好考吗?
  15. python数列求和_python练习--数列求和
  16. tushare获取沪深300指数历史_tushare正确爬取 指数数据
  17. clamped b_spline
  18. 【HTML】铺满背景图片
  19. 【软件需求工程与建模】13组组队项目小组分工及当前完成的工作
  20. 有介质的高斯定理详细证明(电偶极子模型)以及例题讲解

热门文章

  1. Bootloader的分区和启动
  2. HAProxy入门及常用配置模拟测试
  3. Oracle数据库迁移
  4. SharePoint 自定义WebPart之间的连接
  5. 农民工上网求职事半功倍
  6. JavaScript学习与实践(8)
  7. 说说如何搭建 Nginx 反向代理 Tomcat
  8. DevOps \u0026 SRE 必备技能清单
  9. JBPM4.4_jBPM4.4应用(与Spring集成自行控制事务等)
  10. 09-JS中table模糊查询