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语言-在mac下brew升级golang
Apr 25 Golang
Go语言带缓冲的通道实现
Apr 26 Golang
golang中的空slice案例
Apr 27 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
解决golang post文件时Content-Type出现的问题
May 02 Golang
Golang: 内建容器的用法
May 05 Golang
解决golang 关于全局变量的坑
May 06 Golang
golang 实现时间戳和时间的转化
May 07 Golang
golang 实用库gotable的具体使用
Jul 01 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 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
array_multisort实现PHP多维数组排序示例讲解
2011/01/04 PHP
PHP中读取照片exif信息的方法
2014/08/20 PHP
PHP中SSO Cookie登录分析和实现
2015/11/06 PHP
PHP 绘制网站登录首页图片验证码
2016/04/12 PHP
PHP基于Redis消息队列实现发布微博的方法
2017/05/03 PHP
基于jquery的loading 加载提示效果实现代码
2011/09/01 Javascript
jQuery遍历json中多个map的方法
2015/02/12 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
JS动态给对象添加属性和值的实现方法
2016/10/21 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
vue实现列表的添加点击
2016/12/29 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
详解如何使用Vue2做服务端渲染
2017/03/29 Javascript
JavaScript学习笔记之DOM基础操作实例小结
2019/01/09 Javascript
Vue 中 a标签上href无法跳转的解决方式
2019/11/12 Javascript
Javascript操作select控件代码实例
2020/02/14 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
2020/04/28 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
在Python中使用__slots__方法的详细教程
2015/04/28 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python win32 简单操作方法
2017/05/25 Python
PYQT5设置textEdit自动滚屏的方法
2019/06/14 Python
简单了解Django ContentType内置组件
2019/07/23 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
法人授权委托书
2014/04/03 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
新闻人物通讯稿
2014/10/09 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
2015年教育实习工作总结
2015/04/24 职场文书
运动会通讯稿600字
2015/07/20 职场文书
2016年九九重阳节活动总结
2016/04/01 职场文书
创业计划书之养殖业
2019/10/11 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL