golang 打印函数名/文件名/行号 Callers
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相关推荐
- Go打印函数名/文件名/行号
package main import ("fmt";"runtime")/* golang 的runtime库,提供Caller函数,可以返回运行时正在执行的 ...
- python获取代码当前行数_Python实验室一段日志代码,获取当前调用的函数名和行号...
代码如下: #............. class CrawlerLog(object): def __init__(self, logName=None): #............ self. ...
- 【Qt】qt打印文件名、函数名、行号
#include <QDebug> #define MyDebug qDebug()<<"[FILE:"<<__FILE__<<&q ...
- linux c 中 当前函数名 文件名 可变参 不定参 宏使用
在linux编程中,当文件数量变的众多之后,使用gdb调试就是一场灾难.因此在程序中加入合理的打印信息,定位错误出现的文件名,函数名,行号等信息,能更高效的定位到问题的所在. 下面定义了宏,分别是WA ...
- java获取文件名方法,利用Java获取文件名、类名、方法名和行号的方法小结
大家都知道,在C语言中,我们可以通过宏FILE. __LINE__来获取文件名和行号,而在Java语言中,则可以通过StackTraceElement类来获取文件名.类名.方法名.行号,具体代码如下: ...
- c打印行号和函数_使用C中的函数名称,行号从任何函数打印错误消息
c打印行号和函数 Sometimes, it is necessary to print some message on logic failure or anytime with the funct ...
- linux打印函数名,linux kernel 打印函数指针对应的函数名方法
linux kernel 打印函数指针对应的函数名方法 内核中函数指针用的很多,在debug 的时候能直接打印出一个函数指针对应的函数就会很方便. 打印裸指针(raw pointer)用 %p,%p除 ...
- java获取当前运行代码的类名、方法名、行号
1.获取当前运行代码的类名,方法名,行号,主要是通过java.lang.StackTraceElement类 2. [1]获得调用者的方法名, 同new Throwable String _metho ...
- Go 学习笔记(54)— Go 第三方库之 uber-go/zap/lumberjack(记录日志到文件、支持自动分割日志、支持日志级别、打印调用文件、函数和行号)
1. 简要说明 zap 是 uber 开源的 Go 高性能日志库,支持不同的日志级别, 能够打印基本信息等,但不支持日志的分割,这里我们可以使用 lumberjack 也是 zap 官方推荐用于日志分 ...
最新文章
- 第五篇:并发控制-隔离
- 阿里代码规范插件 中文使用手册 FOR Eclipse
- HokeyPokey — WWDC讲师特供XCode插件高仿版的设计与实现
- Spring Boot配置多数据源
- SAP Cloud for Customer里根据External Reference搜索销售订单
- mysql 单表字段多少合适_复制信息记录表|全方位认识 mysql 系统库
- 解决NHibernate 中与 SQL2005 关键字有冲突的问题
- Java讲课笔记13:类的继承
- 利用Python分析羊车门问题
- 七、MySQL中的字符集 - 系统的撸一遍MySQL
- 呼叫中心几种常见质检方式的对比
- 计算机英语吕,吕的英语_我姓吕托福注册姓名的英文姓是写LYU还是LV还是LU我的护照上写的是LYU_淘题吧...
- 移动终端基础数据管理系统
- 软考高级的信息系统项目管理师零基础好考吗?
- python数列求和_python练习--数列求和
- tushare获取沪深300指数历史_tushare正确爬取 指数数据
- clamped b_spline
- 【HTML】铺满背景图片
- 【软件需求工程与建模】13组组队项目小组分工及当前完成的工作
- 有介质的高斯定理详细证明(电偶极子模型)以及例题讲解