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语言中切片与内存复制 memcpy 的实现操作
Apr 27 Golang
golang json数组拼接的实例
Apr 28 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
解决Go gorm踩过的坑
Apr 30 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
go语言中fallthrough的用法说明
May 06 Golang
Go语言基础知识点介绍
Jul 04 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
golang内置函数len的小技巧
Jul 25 Golang
深入理解 Golang 的字符串
May 04 Golang
Python测试框架pytest核心库pluggy详解
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中比较简单的导入phpmyadmin生成的sql文件的方法
2011/06/28 PHP
PHP生成条形图的方法
2014/12/10 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
javascript入门·图片对象(无刷新变换图片)\滚动图像
2007/10/01 Javascript
图片Slider 带左右按钮的js示例
2013/08/30 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
javascript几个易错点记录
2014/11/26 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
怎样在vue项目下添加ESLint的方法
2019/05/16 Javascript
使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果
2019/08/16 Javascript
Python版实现微信公众号扫码登陆
2020/05/28 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
PYTHON基础-时间日期处理小结
2018/05/05 Python
Python中flatten( )函数及函数用法详解
2018/11/02 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
Python datetime包函数简单介绍
2019/08/28 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
Python参数传递机制传值和传引用原理详解
2020/05/22 Python
虚拟机下载python是否需要联网
2020/07/27 Python
CSS3制作精致的照片墙特效
2016/06/07 HTML / CSS
澳大利亚足球鞋和服装购物网站:Ultra Football
2018/10/11 全球购物
后勤主管工作职责
2013/12/07 职场文书
党员组织关系介绍信
2014/02/13 职场文书
贯彻学习两会心得体会范文
2014/03/17 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
元宵节晚会主持词
2015/07/01 职场文书
工作简报格式范文
2015/07/21 职场文书
Golang 获取文件md5校验的方法以及效率对比
2021/05/08 Golang
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python
详解SQL的窗口函数
2022/04/21 Oracle
kubernetes集群搭建Zabbix监控平台的详细过程
2022/07/07 Servers