Golang 实现获取当前函数名称和文件行号等操作


Posted in Golang onMay 08, 2021

大家还是直接看代码吧~

// 获取正在运行的函数名
func runFuncName()string{
    pc := make([]uintptr,1)
    runtime.Callers(2,pc)
    f := runtime.FuncForPC(pc[0])
    return f.Name()
}
package main 
import(
    "fmt"
    "runtime"
)
 
// 获取正在运行的函数名
func runFuncName()string{
    pc := make([]uintptr,1)
    runtime.Callers(2,pc)
    f := runtime.FuncForPC(pc[0])
    return f.Name()
}
 
func test1(){
    i:=0
    fmt.Println("i =",i)
    fmt.Println("FuncName1 =",runFuncName())
}
 
func test2(){
    i:=1
    fmt.Println("i =",i)
    fmt.Println("FuncName2 =",runFuncName())
}
 
func main(){
    fmt.Println("打印运行中的函数名")
    test1()
    test2()
}

golang 的runtime库,提供Caller函数,可以返回运行时正在执行的文件名和行号:

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

Caller reports file and line number information about function invocations on the calling goroutine's stack. The argument skip is the number of stack frames to ascend, with 0 identifying the caller of Caller. (For historical reasons the meaning of skip differs between Caller and Callers.) The return values report the program counter, file name, and line number within the file of the corresponding call. The boolean ok is false if it was not possible to recover the information.

调用方法如下,返回的file为绝对路径,line为行号。有了这个就可以在自己的日志等函数中添加这个记录了。

_, file, line, ok := runtime.Caller(1)

补充:go 定位函数操作位置(文件名、函数名、所在行)

runtime.Caller()返回函数执行程序计数pc、执行的文件名和所在行数

runtime.FuncForPC()传入pc,得到运行的函数指针

文件结构

- runtime
- -file1.go
- -file2.go
- -main.go

main.go文件

package main
import (
	"fmt"
	"path"
	"runtime"
)
func main(){
	name, funcName, line := f2(0)
	fmt.Printf("file:%v;function:%v;line:%d",name,funcName,line)
}
func getLocation(skip int)(fileName ,funcName string ,line int){
	pc, file, line, ok := runtime.Caller(skip)
	if !ok {
		fmt.Println("get info failed")
		return
	}
	fmt.Println(pc,file)
	fileName = path.Base(file)
	funcName = runtime.FuncForPC(pc).Name()
	return
}

file1.go文件

package main
func f1(skip int)(fileName ,funcName string ,line int){
 fileName, funcName, line = getLocation(skip)
 return
}

file2.go文件

package main
func f2(skip int)(fileName ,funcName string ,line int){
 return f1(skip)
}

当在main.go文件中调用f2时

func main(){
 name, funcName, line := f2(3)
 fmt.Printf("file:%v;function:%v;line:%d",name,funcName,line)
 //output:file:main.go;function:main.main;line:10
}

f2调取f1,f1调取getLocation;f2->f1->getLocation经历了三层调用,所以在f2中传入3时,返回的当前该函数的执行位置及所在函数名、所在文件名

当传入2时,返回的是(file:file2.go;function:main.f2;line:8)f2函数所在函数名、文件位置、文件名

当传入1时,返回的是(file:file1.go;function:main.f1;line:4)f1函数所在函数名、文件位置、文件名

当传入0时,返回的是(file:main.go;function:main.getLocation;line:16)getLocation函数所在函数名、文件位置、文件名

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
Go语言操作数据库及其常规操作的示例代码
Apr 21 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
goland 恢复已更改文件的操作
Apr 28 Golang
解决Go gorm踩过的坑
Apr 30 Golang
go语言中http超时引发的事故解决
Jun 02 Golang
Go语言基础知识点介绍
Jul 04 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang 结构体数据集合
Apr 22 Golang
深入理解 Golang 的字符串
May 04 Golang
Go语言编译原理之源码调试
Aug 05 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 #Golang
GoLang中生成UUID唯一标识的实现
May 08 #Golang
聊聊golang中多个defer的执行顺序
May 08 #Golang
Golang全局变量加锁的问题解决
golang 实现并发求和
May 08 #Golang
golang中的并发和并行
May 08 #Golang
关于golang高并发的实现与注意事项说明
May 08 #Golang
You might like
PHP的FTP学习(四)
2006/10/09 PHP
在字符串中把网址改成超级链接
2006/10/09 PHP
用PHP实现的四则运算表达式计算实现代码
2011/08/02 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
理解 JavaScript 预解析
2009/10/25 Javascript
js实现点击图片将图片地址复制到粘贴板的方法
2015/02/16 Javascript
jQuery选择器源码解读(五):tokenize的解析过程
2015/03/31 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
深入学习Vue nextTick的用法及原理
2019/10/08 Javascript
Laravel 如何在blade文件中使用Vue组件的示例代码
2020/06/28 Javascript
[50:12]EG vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python设计模式之代理模式实例
2014/04/26 Python
Python AES加密实例解析
2018/01/18 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
用python读取xlsx文件
2020/12/17 Python
CSS3 制作旋转的大风车(充满童年回忆)
2013/01/30 HTML / CSS
HTML5 Canvas 破碎重组的视频特效的示例代码
2019/09/24 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
印尼旅游网站:via
2017/11/12 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
霸王洗发水广告词
2014/03/14 职场文书
文明寝室申报材料
2014/05/12 职场文书
房展策划方案
2014/06/07 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
2016年“世界气象日”广播稿
2015/12/17 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python