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
相关推荐
序安InToo14 分钟前
第6课|注释与代码风格
后端·操作系统·嵌入式
xyy12314 分钟前
C#: Newtonsoft.Json 到 System.Text.Json 迁移避坑指南
后端
洋洋技术笔记16 分钟前
Spring Boot Web MVC配置详解
spring boot·后端
JxWang0517 分钟前
VS Code 配置 Markdown 环境
后端
navms20 分钟前
搞懂线程池,先把 Worker 机制啃明白
后端
JxWang0520 分钟前
离线数仓的优化及重构
后端
Nyarlathotep011321 分钟前
gin01:初探gin的启动
后端·go
JxWang0522 分钟前
安卓手机配置通用多屏协同及自动化脚本
后端
JxWang0523 分钟前
Windows Terminal 配置 oh-my-posh
后端
SimonKing39 分钟前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员