Go打印行号和文件名

runtime.Caller

cpp 复制代码
func Caller(skip int) (pc uintptr, file string, line int, ok bool)

Caller报告当前go程调用栈所执行的函数的文件和行号信息。实参skip为上溯的栈帧数,0表示Caller的调用者(Caller所在的调用栈)。函数的返回值为调用栈标识符、带路径的完整文件名、该调用在文件中的行号。如果无法获得信息,ok会被设为false。

这里的skip指的是跳过多少个函数栈:

skip == 0,不跳过函数栈,返回当前函数PC,文件名,所在行

skip == 1,跳过当前函数栈,返回上层调用者调用当前函数时的PC,文件名,所在行

skip == 2,以此类推

根据pc获取函数名

根据返回的调用栈标识符pc,我们可以获取对应的函数名。

需要用到一个函数和一个方法,签名如下:

cpp 复制代码
func FuncForPC(pc uintptr) *Func

func (*Func) Name

FuncForPC返回一个表示调用栈标识符pc对应的调用栈的*Func;如果该调用栈标识符没有对应的调用栈,函数会返回nil。每一个调用栈必然是对某个函数的调用。

Name返回该调用栈所调用的函数的名字。
实例

cpp 复制代码
package main

import (
	"fmt"
	"path"
	"runtime"
)

func getInfo(skip int) (funcName, fileName string, lineNo int) {
	pc, file, lineNo, ok := runtime.Caller(skip)
	if !ok {
		fmt.Println("runtime.Caller() failed")
		return
	}
	funcName = runtime.FuncForPC(pc).Name()
	fileName = path.Base(file) // Base函数返回路径的最后一个元素
	return
}

func main() {
	fmt.Println(getInfo(0))
	fmt.Println(getInfo(1))
}

输出

cpp 复制代码
main.getInfo main.go 10
main.main main.go 22
相关推荐
wearegogog12319 小时前
基于MATLAB的D2D仿真场景实现
开发语言·网络·matlab
froginwe1119 小时前
Chart.js 散点图详解
开发语言
独自破碎E19 小时前
【纵向扫描】最长公共前缀
java·开发语言
nuo53420219 小时前
C语言实现类似面向对象的三大特性
c语言·开发语言
321.。19 小时前
深入理解 Linux 线程封装:从 pthread 到 C++ 面向对象实现
linux·开发语言·c++
zfoo-framework19 小时前
kotlin
android·开发语言·kotlin
能源革命19 小时前
Three.js、Unity、Cesium对比分析
开发语言·javascript·unity
虾说羊19 小时前
JWT的使用方法
java·开发语言
Just right19 小时前
python安装包问题
开发语言·python
dxz_tust19 小时前
flow match简单直观理解
开发语言·python·深度学习·扩散模型·流匹配·flow match