Go学习——runtime.Caller()函数
目录
- 函数:
- 参数解释:
- 例子:
函数:
func Caller(skip int) (pc uintptr, file string, line int, ok bool)
Caller()报告当前go程调用栈所执行的函数的文件和行号信息。
参数解释:
skip
:
上溯的栈帧数,0表示Caller的调用者(Caller所在的调用栈)(0-当前函数,1-上一层函数,…)。pc
:
调用栈标识符file
:
文件路径line
:
该调用在文件中的行号ok
:
如果无法获得信息,ok会被设为false
例子:
可能看了上面的解释,对于skip
参数依然很迷惑,那我们来看个例子:
此时的项目目录结构:
blog/├── conf /...├── main.go├── middleware /...├── models /...├── pkg│ ├── e /...│ ├── logging│ │ ├── file.go│ │ └── log.go│ ├── setting /...│ └── util /...├── routers│ ├── api│ │ ├── auth.go│ │ └── v1│ │ ├── article.go│ │ └── tag.go│ └── router.go├── runtime
就拿 blog/routers/api/v1/article.go
当例子,在这个文件中GetArticle()
中用到了logging.Info()
:
// followJianYuStudyGo/routers/api/v1/article.go
func GetArticle(c *gin.Context) {...} else {for _, err := range valid.Errors {logging.Info(err.Key, err.Message) // article.go:122 上溯栈帧数skip = 2}}...
}// followJianYuStudyGo/pkg/logging/log.go
func Info(v ...interface{}) {setPrefix(INFO) // log.go:67 上溯栈帧数skip = 1logger.Println(v)
}func setPrefix(level Level) {_, file, line, ok := runtime.Caller(DefaultCallerDepth) // log.go:50 上溯栈帧数skip = 0....
}
如果我们的skip
:
- 为0:
代表上溯的栈帧数为0,返回的file
就是调用Caller()
的位置:[INFO][log.go:50]2022/04/29 21:07:11 [created_by 创建人不可以为空]
- 为1:
代表上溯的栈帧数为1,返回的file
就是调用Caller()
的上一层位置:[INFO][log.go:67]2022/04/29 21:25:57 [state 状态只允许为0或1]
- 为2:
代表上溯的栈帧数为2,返回的file
就是调用Caller()
的上一层的上一层位置:[INFO][article.go:122]2022/04/29 20:52:23 [state 状态只允许为0或1]
重点:
因为我们在logging
包里的log.go
文件封装了Info()、Debug()、Warn()、....
函数,其他地方调用的都是这种封装好的函数,所以如果我们打印日志的时候,想要获取使用了logging.Info()
的位置,runtime.Caller(skip int)
的skip是要设置为2的(原因见skip=2的部分)!!!!
Go学习——runtime.Caller()函数相关推荐
- golang runtime.Caller 学习笔记
runtime.Caller runtime.Caller可以获取到调用时的代码文件路径.行数等信息,在打印日志时常常使用 runtime.Caller源码 // Caller reports fil ...
- Go 学习笔记(22)— 并发(01)[进程、线程、协程、并发和并行、goroutine 启动、goroutine 特点,runtime 包函数]
Go 语言通过编译器运行时( runtime ),从语言上支持了并发的特性. 虽然 Go 程序编译后生成的是本地可执行代码,但是这些可执行代码必须运行在Go 语言的运行时(Runtime )中.Go ...
- runtime Caller 方法再封装
在 Go单元测试--资源初始化 里获取配置文件的绝对路径时,提到了 Caller 方法.这个方法在日志打印的包中特别常见. 日志文件中记录的文件路径和行号,就是这个函数的返回值. pc, file, ...
- Golang中的runtime.Caller理解
func Caller(skip int) (pc uintptr, file string, line int, ok bool) 参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,. ...
- PostgreSQL学习手册(五) 函数和操作符
PostgreSQL学习手册(五) 函数和操作符 一.逻辑操作符: 常用的逻辑操作符有:AND.OR和NOT.其语义与其它编程语言中的逻辑操作符完全相同. 二.比较操作符: 下面是Po ...
- python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...
- excel公式 某一个单元格等于另一个单元格的值_EXCEL函数学习5——COUNTIF函数
[标签] excel函数.统计函数 前面我们学习了COUNT函数,我们回顾一下: count函数很简单,就是统计一个或多个区域的数字个数.相对来说,countif函数多了一个if,也就是可以增加条件了 ...
- 学习Kotlin(五)函数与Lambda表达式
推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...
- Python编程学习:让函数更加灵活的*args和**kwargs(设计不同数量参数的函数)的简介、使用方法、经典案例之详细攻略
Python编程学习:让函数更加灵活的*args和**kwargs(设计不同数量参数的函数)的简介.使用方法.经典案例之详细攻略 目录 *args和**kwargs(设计不同数量的参数函数)的简介 1 ...
最新文章
- MapReduce Job集群提交过程源码跟踪及分析
- stl min函数_std :: min()函数以及C ++ STL中的示例
- mysql5.6 慢查询_MySQL5.6 如何优化慢查询的SQL语句
- Riot Blockchain再次购入1.5万台比特大陆S19系列矿机
- 太赫兹芯片是什么原理_太赫兹微芯片速度可提升100倍 却遭遇研发两大挑战
- 前端构建工具与应用程序测试
- (转)以太坊(Ethereum)全零地址(0x000000...)揭秘
- EfficientDeRainy:一种高效的图像去雨雾算法
- 千帆竞发百日角逐,玻色量子荣获“创业北京”一等奖
- 【高中必修二】几何体
- 论企业组织架构的扁平化管理
- 开源程序LAN_share 单例模式巧用
- python实训总结万能版3000字_万能实习报告论文范文3000字
- 智融SW6206、SW3516、SW3522、SW2303等快充市场方案应用
- 上皮细胞膜纳米囊泡包裹药物如紫杉醇,喜树碱,阿霉素
- 软件测试工程师Linux笔试题及答案(三)
- sakai上传大文件失败解决方案
- python分析微博数据中心_未明学院:量化金融项目实战,成为掌握数据分析技能的复合型人才!...
- 基于i.MX8M处理器MYC-JX8MX核心板
- 使用idea创建servlet程序(idea:2021.2)
热门文章
- [论文笔记]Arbitrary-Oriented Scene Text Detection via Rotation Proposals
- 【ESP 保姆级教程】疯狂Node.js服务器篇 ——案例:ESP8266 + MQ3酒精传感器 + NodeJs本地服务 + 文件存储数据
- EC esayClick 自定义浮窗
- Poi 4.0设置自定义背景颜色
- linux篇之安装MySQL及远程连接
- 电子计算机里CE,电子计算机上的ce表示什么意思
- 首届华为开发者大赛沙龙牵手大连-与开发者共话赛事
- FQQ兵法,适用于各种版本以及种族
- 【数学建模】12 线性规划模型的求解方法
- 电力行业DC-DC电源模块的选型