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 相关文章推荐
解决golang在import自己的包报错的问题
Apr 29 Golang
Go使用协程交替打印字符
Apr 29 Golang
Golang 编译成DLL文件的操作
May 06 Golang
解决golang 关于全局变量的坑
May 06 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Golang数据类型和相互转换
Apr 12 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
Go语言测试库testify使用学习
Jul 23 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 Golang
基于Python实现西西成语接龙小助手
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调用mysql存储过程
2007/02/14 PHP
一个很不错的PHP翻页类
2009/06/01 PHP
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
smarty模板引擎中自定义函数的方法
2015/01/22 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
JS自动适应的图片弹窗实例
2013/06/29 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
nodejs基础应用
2017/02/03 NodeJs
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
详解vue-cli之webpack3构建全面提速优化
2017/12/25 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
angularJS实现不同视图同步刷新详解
2018/10/09 Javascript
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
用python实现面向对像的ASP程序实例
2014/11/10 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
python sort、sort_index方法代码实例
2019/03/28 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
Python三维绘图之Matplotlib库的使用方法
2020/09/20 Python
阿玛尼美国官方网站:Armani.com
2016/11/25 全球购物
英国可持续奢侈品包包品牌:Elvis & Kresse
2018/08/05 全球购物
幼师自我鉴定范文
2013/10/01 职场文书
岗位职责范本
2013/11/23 职场文书
客服工作职责
2013/12/11 职场文书
刘胡兰的英雄事迹材料
2014/02/11 职场文书
个人四风问题原因分析及整改措施
2014/09/28 职场文书
2016年社会管理综治宣传月活动总结
2016/03/16 职场文书
决心书格式及范文
2019/06/24 职场文书