95. Go中runtime.Caller的使用

runtime.Caller
函数定义
func runtime.Caller(skip int) (pc uintptr, file string, line int, ok bool)

作用

获取函数Caller的调用信息

参数
skip=0时: 返回调用Caller的函数A的pc(program counter)(A即runtime.Caller代码当前所在函数)、所在文件名以及Caller在函数A中的行数
skip=1时: 返回调用函数A的函数B的pc、所在文件名以及函数A在函数B中的行数;以此类推

pc: 程序计数器,指向下一条将要取指的指令地址
file: pc对应的函数所在文件路径
line: 被调用方在pc对应的函数中的行数

示例:
/Users/go/src/liyouming/golang-trick/40-clean-code-controll-flow/util/util.go

go 复制代码
package util

import (
	"bytes"
	"fmt"
	"runtime"
)

func CallerTest() {
	for i := 0; i <= 4; i++ {
		pc, file, line, ok := runtime.Caller(i)
		if ok {
			fmt.Printf("当i:=%d时:\n调用者的pc:%v\n调用者的函数名:%s\n"+
				"调用者所在file:%s\n被调用者在调用者中的line:%d\n", i, pc, runtime.FuncForPC(pc).Name(), file, line)
			fmt.Println(string(bytes.Repeat([]byte("*"), 10)))
		}
	}
}

main.go

go 复制代码
package main

import (
	"golang-trick/40-clean-code-controll-flow/util"
)

func main() {
	util.CallerTest()
}

运行结果如下:

go 复制代码
当i:=0时:
调用者的pc:17363077
调用者的函数名:golang-trick/40-clean-code-controll-flow/util.CallerTest
调用者所在file:/Users/go/src/liyouming/golang-trick/40-clean-code-controll-flow/util/util.go
被调用者在调用者中的line:11
**********
当i:=1时:
调用者的pc:17363702
调用者的函数名:main.main
调用者所在file:/Users/go/src/liyouming/golang-trick/40-clean-code-controll-flow/main.go
被调用者在调用者中的line:8
**********
当i:=2时:
调用者的pc:16987729
调用者的函数名:runtime.main
调用者所在file:/usr/local/opt/go/libexec/src/runtime/proc.go
被调用者在调用者中的line:250
**********
当i:=3时:
调用者的pc:17158656
调用者的函数名:runtime.goexit
调用者所在file:/usr/local/opt/go/libexec/src/runtime/asm_amd64.s
被调用者在调用者中的line:1594
**********
相关推荐
小宋10214 分钟前
实现java执行kettle并传参数
java·开发语言·etl
Smilejudy13 分钟前
三行五行的 SQL 只存在于教科书和培训班
后端·github
爱上语文17 分钟前
Http 请求协议
网络·后端·网络协议·http
FreeLikeTheWind.18 分钟前
C语言实例之9斐波那契数列实现
c语言·开发语言·算法
贝克街的天才27 分钟前
据说在代码里拼接查询条件不够优雅?Magic-1.0.2 发布
java·后端·开源
爱编程— 的小李31 分钟前
文件的处理(c语言)
c语言·开发语言
monkey_meng35 分钟前
【Rust Iterator 之 fold,map,filter,for_each】
开发语言·后端·rust
运维&陈同学37 分钟前
【kafka01】消息队列与微服务之Kafka详解
运维·分布式·后端·微服务·云原生·容器·架构·kafka
Vae_Mars38 分钟前
QT-protected
开发语言·qt
JosieBook1 小时前
【面试题】2025年百度校招Java后端面试题
java·开发语言·网络·百度