【Golang | runtime】runtime.Caller和runtime.Callers的使用和区别

news2024/11/15 15:32:38

环境:
go version go1.18.2

1、runtime.Caller

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

作用

获取函数Caller的调用信息

参数

  • skip: =0时,返回调用Caller函数A的pc(program counter)、所在文件名以及Caller函数A中的行数;=1时, 返回调用函数A函数B的pc、所在文件名以及函数A函数B中的行数;以此类推
  • pc: 程序计数器,指向下一条将要取指的指令地址
  • file: pc对应的函数所在文件
  • line: 被调用方在pc对应的函数中的行数

e.g.

项目结构如下:

在这里插入图片描述

tool.tool.go

package tool

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

package main

import "caller/tool"

func main() {
	tool.CallerTest()
}

运行结果如下:

PS E:\goland-workspace\GolangLearning\Common\caller> go run .\main.go
当i:=0时:
调用者的pc:15191590
调用者的函数名:caller/tool.CallerTest
调用者所在file:E:/goland-workspace/GolangLearning/Common/caller/tool/tool.go
被调用者在调用者中的line:11
**********
当i:=1时:
调用者的pc:15192214
调用者的函数名:main.main
调用者所在file:E:/goland-workspace/GolangLearning/Common/caller/main.go
被调用者在调用者中的line:6
**********
当i:=2时:
调用者的pc:14832765
调用者的函数名:runtime.main
调用者所在file:D:/golang/install/src/runtime/proc.go
被调用者在调用者中的line:250
********** 	
当i:=3时:
调用者的pc:14990688
调用者的函数名:runtime.goexit
调用者所在file:D:/golang/install/src/runtime/asm_amd64.s
被调用者在调用者中的line:1571
**********

2. runtime.Callers

函数func runtime.Callers(skip int, pc []uintptr) int

作用

类似函数Caller,可以在入参pc中填充Callers所有的调用信息(前提是pc切片空间足够)

参数

  • skip:区别于Caller,skip=0时,代表Callers函数本身,skip=1时,代表调用Callers的函数
  • pc:存储Callers所有的调用方pc

e.g.

项目结构如下:

在这里插入图片描述

tool.tool.go

package tool

import (
	"fmt"
	"runtime"
)

func CallersTest() {
	pc := make([]uintptr, 32)
	n := runtime.Callers(0, pc)
	cf := runtime.CallersFrames(pc[:n])
	for {
		frame, more := cf.Next()
		if !more {
			break
		} else {
			fmt.Println(frame)
		}
	}

}

main.go

package main

import "callers/tool"

func main() {
	tool.CallersTest()
}

运行结果如下:

PS E:\goland-workspace\GolangLearning\Common\callers> go run .\main.go
{11711796 <nil> runtime.Callers D:/golang/install/src/runtime/extern.go 235 11711712 {0xbc2550 0xbc8a00}}
{11711778 0xbc2550 callers/tool.CallersTest E:/goland-workspace/GolangLearning/Common/callers/tool/tool.go 10 11711712 {0xbc2550 0xbc8a00}}
{11712246 0xbc2598 main.main E:/goland-workspace/GolangLearning/Common/callers/main.go 6 11712224 {0xbc2598 0xbc8a00}}
{11359357 0xbb2370 runtime.main D:/golang/install/src/runtime/proc.go 250 11358848 {0xbb2370 0xbc8a00}}

注:

  • 需要借助函数runtime.CallersFrames来获取Callers的调用关系,不能直接根据runtime.Callers(0, pc)中pc的值来获取,否则获取的调用顺序可能不正确
  • 可以看到当skip=0时,pc[0]指向Callers函数本身,pc[1]指向调用Callers的函数callers/tool.CallersTest,以此类推

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SI12T触摸按键芯片兼容TMS12资料

Si12T 是一款具有自动灵敏度校准功能的 12 通道电容传感器&#xff0c;其工作电压 范围为 1.8 ~ 5.0 V 。 Si12T 设置 IDLE 模式来节省功耗&#xff0c;此时&#xff0c;功耗电流为 3.5 A3.3V 。 Si12T 有三种特殊功能&#xff1a;一种是通道 1 上的嵌入式电源键…

体验Kubernetes(k8s),使用minikube搭建单机k8s

文章目录 一、windows&#xff1a;使用Minikube搭建单节点K8s1、安装VirtualBox2、安装kubectl3、安装minikube4、使用minikube搭建k8s 二、centos&#xff1a;使用minikube搭建单节点k8s1、安装docker2、下载kubectl&minikube与安装3、搭建单机k8s4、体验pod 一、windows&…

【计算机网络】MAC地址、IP地址、ARP协议

1.总概念 2.MAC地址 2.1 MAC地址作用 2.2 网络适配器&#xff08;网卡&#xff09; 2.3 概念 2.4 MAC地址格式 2.5 MAC地址发送顺序 单播MAC地址 广播MAC地址 多播MAC地址 随机MAC地址&#xff08;信息安全和隐私保护&#xff09; 2.6小结 3. IP地址 3.1 IP地址作用 3.2 网络…

【C#】实体类和DataTable之间相互转换,实体反射动态遍历列

在实际项目中&#xff0c;经常会用到数据之间的相互转换&#xff0c;序列化和反序列化就是常见场景。这里我们只简单聊聊实体类和DataTable之间的相互转换&#xff0c;可以用于不同业务场景使用。 目录 1、DataTable转Model2、Model转DataTable3、反射概念3.1、Type 类型3.2、A…

力扣 669. 修剪二叉搜索树

题目来源&#xff1a;https://leetcode.cn/problems/trim-a-binary-search-tree/description/ C题解1&#xff1a;递归法。当前节点为空时返回空&#xff0c;不为空时对其值进行分类讨论。以low为例&#xff0c;当前节点值等于low时&#xff0c;意味着其左子树都要丢弃&#xf…

uniapp小程序进入横屏页面后竖屏页面样式错乱放大

问题描述&#xff1a;进入横屏页面后退出再进入一个竖屏页面&#xff0c;样式会错乱放大 解决方法 1.新增一个空白页&#xff0c;blank.vue <template> </template><script>export default {data() {return {}},onLoad(options) {uni.navigateBack({delta…

青岛大学_王卓老师【数据结构与算法】Week03_10_线性表的链式表示和实现10_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码。过滤器可以配置为全局有效、仅对控制器有效或是仅对 Action 有效。 查看或下载演示代码. 过滤器如何工作&#xff1f; 不同的过滤器类型会在执行管道的不同阶段运行&#xff0c;因此它们各自有一套适用场景。根据你…

攻防视角下的信息收集组合拳-蓝队视角

攻防视角下的信息收集组合拳-蓝队视角 背景蓝队角度一、攻击前的信息收集1、企业资产梳理2、企业敏感文件清理 二、被攻击后的信息收集1、入侵成功信息收集技巧2、入侵失败信息收集技巧-锁定攻击IP反制技巧 背景 红蓝对抗中&#xff0c;最为重要的就是信息收集&#xff0c;无论…

国外追踪水资源短缺的6幅干旱地图

今天为大家分享国外6个干旱地图&#xff0c;这些地图使我们能够通过最新信息了解干旱的严重程度和范围。 它们通过捕捉水的可用性等关键信息&#xff0c;以便我们能够主动规划和应对干旱的影响。 全球干旱信息系统(GDIS) 地图网址&#xff1a; https://experience.arcgis.co…

HarmonyOS/OpenHarmony应用开发-Stage模型UIAbility组件使用(二)

UIAbility组件启动模式 UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景&#xff0c;系统提供了三种启动模式&#xff1a; singleton&#xff08;单实例模式&#xff09; standard&#xff08;标准实例模式&#xff09; specified&#xff0…

青少年机器人技术一级核心知识点、水平要求和考试标准

青少年机器人技术的发展已成为当今世界科技领域中备受瞩目的一项技术。机器人技术的应用范围越来越广泛&#xff0c;不仅在工业制造、医疗、教育等领域中得到广泛应用&#xff0c;同时也成为了青少年学习STEM&#xff08;科学、技术、工程、数学&#xff09;的重要内容。 为了…

错误: 字段“datlastsysoid“不存在(Navicat报错)

公司项目用到Postgres数据库&#xff0c;可视化管理工具我一般用的Navicat&#xff0c;之前也没有怎么用过Postgres数据库&#xff0c;自然对应的pgAmin工具也不是用起来也不是很友好&#xff0c;所以偷懒用Navicat&#xff0c;连接成功后&#xff0c;报错如下&#xff1a; 查…

ssm 招聘信息管理系统-计算机毕设 附源码78049

ssm 招聘客户管理系统 摘 要 由于数据库和数据仓库技术的快速发展&#xff0c;招聘客户管理系统建设越来越向模块化、智能化、自我服务和管理科学化的方向发展。招聘客户系统对处理对象和服务对象&#xff0c;自身的系统结构&#xff0c;处理能力&#xff0c;都将适应技术发展的…

vue3+ ts引入天地图 搜索功能+地理区域选择

前言&#xff1a; 天地图为开发者提供应用程序开发接口和在线服务资源&#xff0c;可满足各类基于地理信息的应用开发需求。 引入 <script src"http://api.tianditu.gov.cn/api?v4.0&tk你注册的key" type"text/javascript"></script>使…

Spring容器

1. Spring核心容器介绍 问题&#xff1a;按照Bean名称获取Bean有什么弊端&#xff0c;按照Bean类型获取Bean有什么弊端&#xff1f; 1.1 创建容器 方式一&#xff1a;类路径加载配置文件 ApplicationContext ctx new ClassPathXmlApplicationContext("applicationCon…

14. 向用户推荐朋友收藏的商品

文章目录 题目需求思路一&#xff1a;使用 Except实现一实现二&#xff1a;使用 Except思路三&#xff1a;使用 full outer join where实现三实现四&#xff1a;使用 not in concat题目来源 题目需求 现请向所有用户推荐其朋友收藏但是用户自己未收藏的商品&#xff0c;请从…

阻抗计算,真的没有那么难!

问&#xff1a;什么是阻抗&#xff1f; 答&#xff1a;在具有电阻、电感和电容的电路里&#xff0c;对电路中的电流所起的阻碍作用叫做阻抗。 问&#xff1a;什么是阻抗匹配? 答&#xff1a;阻抗匹配是指信号源或者传输线跟负载之间达到一种适合的搭配。阻抗匹配主要有两点作用…

ubuntu git clone 失败

命令行报错如下&#xff1a; gitxxx.xx.com: Permission denied (publickey). fatal: 无法读取远程仓库。修改步骤&#xff1a; 1、.ssh权限配置问题 .ssh 文件夹权限 755 或 700 config 文件权限 644 id_rsa 文件权限 600 id_rsa.pub 文件权限 644 r&#xff1a;read 代表读…

VMware安装Centos7并初始化网络使外部可以访问

本文目录 1&#xff1a;下载镜像2&#xff1a;安装centos7虚拟机2.1:初始化虚拟机2.2 初始化系统2.3 修改虚拟机网络模式 3&#xff1a;配置VMware虚拟网络编辑器4&#xff1a;配置centos网络4.1 修改网络配置文件4.2 刷新网络配置 5 验证网络总结 1&#xff1a;下载镜像 进入…