Go小技巧易错点100例(二十八)
本期分享:
1. runtime.Caller(1)
获取调用者信息
2. for循环
+ select{}
语法
正文:
runtime.Caller(1)
获取调用者信息
在 Go 语言中,runtime.Caller(1)
是 runtime
包提供的一个函数,用于获取当前 goroutine 的调用堆栈中的特定调用者的信息。这里的 1
表示要跳过的调用帧数。具体来说,当你调用 runtime.Caller(1)
时,它会返回调用 runtime.Caller
的函数的调用者的信息。
这个函数的返回值:
- 程序计数器(Program Counter, PC):一个指向当前执行指令的内存地址。
- 文件名:调用发生时的源文件路径。
- 行号:调用发生时的源代码行号。
- 一个布尔值,表示是否成功获取到了调用信息。
使用示例
以下是一个简单的示例,展示了如何在 Go 程序中使用 runtime.Caller(1)
来获取并打印调用者的信息:
func getCallerInfo() (string, string, int) {pc, file, line, ok := runtime.Caller(1)if !ok {return "", "", 0}funcName := runtime.FuncForPC(pc).Name()return funcName, file, line
}func TestCallerInfo(t *testing.T) {funcName, file, line := getCallerInfo()fmt.Printf("func name: %s \n", funcName)fmt.Printf("call file: %s \n", file)fmt.Printf("code line: %d \n", line)
}
输出:
func name: code/code_28.TestCallerInfo
call file: E:/xxx/code/code_28/caller_info_test.go
code line: 19
注意事项
1)获取调用堆栈信息有一定的性能开销,因此不建议在性能敏感的代码路径中频繁使用。
2)在生产环境中,调用堆栈信息通常用于日志记录,以便在出现问题时进行分析和调试。
3)runtime.Caller
和相关的函数是 Go 语言提供的底层运行时接口,它们允许开发者深入了解程序的执行过程,但也需要谨慎使用以避免引入不必要的复杂性或性能问题。
for循环
+ select{}
语法
在Go语言中,for循环
+ select{}
语法是一种用于处理多个通道(channel)的并发操作的语法结构。它允许你在一个循环中同时等待多个通道的操作,并且可以根据哪个通道准备好进行相应的处理。
使用场景
for循环
+ select{}
语法通常用于以下场景:
1)并发处理多个通道:当你需要同时处理多个通道的输入或输出时,可以使用 for select 来避免阻塞并高效地处理数据。
2)超时处理:通过在 select 语句中添加 time.After 或 time.Tick 通道,可以实现超时机制或定时任务。
3)资源管理:在处理多个资源时,可以使用 for select 来确保资源的正确释放和清理。
4)事件驱动编程:在事件驱动的程序中,for select 可以用于监听多个事件源,并根据事件的发生进行相应的处理。
示例
以下是一个简单的示例,展示了如何使用 for select 来处理多个通道
func TestForSelect(t *testing.T) {ch1 := make(chan int)ch2 := make(chan string)go func() {for i := 0; i < 5; i++ {ch1 <- itime.Sleep(time.Second)}close(ch1)}()go func() {for i := 0; i < 5; i++ {ch2 <- fmt.Sprintf("message %d", i)time.Sleep(2 * time.Second)}close(ch2)}()for {select {case num, ok := <-ch1:if !ok {ch1 = nil // 通道关闭后设置为 nil,避免重复关闭} else {fmt.Println("Received from ch1:", num)}case msg, ok := <-ch2:if !ok {ch2 = nil // 通道关闭后设置为 nil,避免重复关闭} else {fmt.Println("Received from ch2:", msg)}case <-time.After(3 * time.Second):fmt.Println("Timeout")default:fmt.Println("No data received")time.Sleep(time.Second)}// 当所有通道都关闭时退出循环if ch1 == nil && ch2 == nil {break}}
}
在这个示例中,我们创建了两个通道 ch1 和 ch2,并分别在两个 goroutine 中向它们发送数据。在主 goroutine 中,我们使用 for select 来同时监听这两个通道,并根据哪个通道准备好进行相应的处理。当所有通道都关闭时,循环退出。
注意事项
1)通道关闭:在处理通道时,需要注意通道的关闭状态,避免在通道关闭后继续读取或写入数据。
2)默认操作:default 分支在没有通道准备好时会被执行,可以用于避免阻塞。
3)超时处理:通过 time.After 或 time.Tick 通道可以实现超时机制,但需要注意避免资源泄漏。
通过合理使用 for select,你可以编写出高效、并发的Go程序。
本节完~
相关文章:
Go小技巧易错点100例(二十八)
本期分享: 1. runtime.Caller(1)获取调用者信息 2. for循环 select{}语法 正文: runtime.Caller(1)获取调用者信息 在 Go 语言中,runtime.Caller(1) 是 runtime 包提供的一个函数,用于获取当前 goroutine 的调用堆栈中的特定…...
Java变量简介
Java变量 -为什么需要变量? 一个程序就是一个世界 变量是程序的基本组成单位 不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位,比如: //变量有三个基本要素(类型+名称+值) class Test{public static void main(String [largs){int a=1;int b=3:b=89;Syst…...
Java快速上手之实验六
1. 编写ItemEventDemo.java,当选中或取消选中单选钮、复选钮和列表框时显示所选的结果。 2.编写GUIExample.java,当选中或取消选中单选钮、复选钮时在标签中显示相应结果。 import javax.swing.*; import java.awt.*; import java.awt.event.…...
【算法应用】基于灰狼算法优化深度信念网络回归预测(GWO-DBN)
目录 1.深度信念网络(Deep Belief Networks, DBNs)2.灰狼算法GWO原理3.结果展示4.参考文献5.代码获取6.读者交流 1.深度信念网络(Deep Belief Networks, DBNs) 深度信念网络(Deep Belief Networks, DBNs)是…...
基于Spring Boot实现STDIO通信的MCP Server与验证
STDIO 是一种基于标准输入输出(Standard Input/Output)的本地通信机制,旨在实现客户端与服务端之间的高效交互。 STDIO 是 MCP 协议支持的传输方式之一,通过操作系统的管道机制(stdin/stdout)进行数据传输,适用于客户端与服务端在同一台机器上的本地通信场景。 本篇基于…...
springboot基于推荐算法的景点推荐系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 本景点推荐系统采用B/S架构,数据库是MySQL,网站的搭建与开发采用了先进的Java进行编写,使用了协同过滤推荐算法和Spring Boot框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。前台主要功能包括:用户…...
【LeetCode Hot100】栈篇
前言 本文用于整理LeetCode Hot100中题目解答,因题目比较简单且更多是为了面试快速写出正确思路,只做简单题意解读和一句话题解方便记忆。但代码会全部给出,方便大家整理代码思路。 20. 有效的括号 一句话题意 验证括号序列有效性。 一句话…...
IO模型和多路复用
一、IO模型的基础理解 什么是IO? IO全称是 Input/Output(输入/输出),在计算机科学里主要指程序与外部设备(硬盘、网络、用户终端等)进行数据交换的操作。首要特点是: IO通常很慢(从CPU和内存的视角看)经常需要等待外部设备响应1. 为什么要谈IO模型? 当一个程序需要…...
私人医生通过AI分析基因数据,是否有权提前告知癌症风险?
首席数据官高鹏律师团队编著 在精准医疗的浪潮中,私人医生借助AI技术解析基因数据、预判癌症风险,已成为高端医疗服务的“隐形标配”。然而,这一技术的光环之下,潜藏着法律与伦理的复杂博弈——医生是否有权基于AI的基因分析提前…...
day 11 超参数调整
一、内参与外参(超参数) 内参是模型为了适应训练数据而自动调整的,是模型内部与训练数据紧密相关的因素,不同的训练数据会导致模型学习到不同的参数值,这些参数在模型训练完成后就固定下来。 超参数是在模型训练前需…...
纯Java实现STDIO通信的MCP Server与客户端验证
在 MCP 协议中通过 STDIO(标准输入/输出)通信 是一种进程间通信(IPC)方式,服务器与客户端通过标准输入(stdin)和标准输出(stdout)交换数据。 关于STDIO 详细介绍以及如何基于Spring Boot项目实现 STDIO 的MCP服务器 以及如何调用和验证服务器可以参考: 基于Spring …...
Vue3学习笔记2——路由守卫
路由守卫 全局 router.beforeEach((to, from, next) > {})router.afterEach((to, from, next) > {}) 组件内守卫 beforeRouteEnter((to, from, next) > {})beforeRouteUpdate((to, from, next) > {})beforeRouteLeave((to, from, next) > {}) 路由独享 be…...
Three.js在vue中的使用(二)-加载、控制
在 Vue 中使用 Three.js 加载模型、控制视角、添加点击事件是构建 3D 场景的常见需求。下面是一个完整的示例,演示如何在 Vue 单文件组件中实现以下功能: 使用 GLTFLoader 加载 .glb/.gltf 模型添加 OrbitControls 控制视角(旋转、缩放、平移…...
【堆】最大堆、最小堆以及GO语言的实现
堆是计算机科学中一种特别的完全二叉树结构,在优先队列、图算法和排序算法中有广泛应用。本文将从概念、原理和实现等方面详细介绍堆这一重要的数据结构。 1. 堆的基本概念 1.1 什么是堆? 堆(Heap)是一种特殊的完全二叉树&…...
动态规划之路劲问题3
解析题目: 跟之前路径题目大概一样,从左上角到右下角,每一步只能向下或者向右,而且每次走出来血量必须大于0(注意这一点,否则容易导致每次出来可能小于0就可能错) 算法分析: 状态…...
学习黑客网络安全法
在正式“开荒”各种黑客工具前,Day 4 的任务是给自己装上一副合规与伦理的“护身铠”。这一小时你将弄懂——做渗透想合法必须先拿授权、哪些法律条款碰不得、等保 2.0 与关基条例为何对企业像副“主线任务”;同时动手把这些要点制成一张“法律速查卡”&…...
节流 和 防抖的使用
节流(Throttle)是一种常用的性能优化技术,用于限制函数的执行频率,确保在一定时间内只执行一次。它常用于处理浏览器事件(如滚动、窗口调整大小、鼠标移动等),以避免因事件触发过于频繁而导致的…...
关于项目中优化使用ConcurrentHashMap来存储锁对象
方案介绍 在开发用户创建私有空间功能时,我们的规则是一个用户最多只能创建一个私有空间。 在最初方案中,我是采用字符串常量池的方式存储锁对象useID。通过intern方法保证 同一用户ID的锁 唯一性。这一方案存在的问题是: 随着userId越来越…...
Java 网络安全新技术:构建面向未来的防御体系
一、Java 安全架构的演进与挑战 1.1 传统安全模型的局限性 Java 平台自 1995 年诞生以来,安全机制经历了从安全管理器(Security Manager)到 Java 平台模块系统(JPMS)的演进。早期的安全管理器通过沙箱模型限制不可信…...
【在Spring Boot中集成Redis】
在Spring Boot中集成Redis 依赖在application.yml中配置Redis服务地址创建Redis配置类缓存工具类使用 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency&…...
昇腾的昇思MindSpore是什么?跟TensorFlow/PyTorch 等第三方框架有什么区别和联系?【浅谈版】
昇腾的昇思 MindSpore 是华为自主研发的全场景深度学习框架,旨在覆盖从科研到工业落地的全流程,支持云、边缘、手机等多种硬件场景的部署。它与 TensorFlow、PyTorch 等第三方框架既有相似性,也有明显差异。 一、昇思 MindSpore 的核心特点 全…...
MySQL进阶(三)
五、锁 1. 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制(避免争抢)。 在数据库中,除传统的计算资源(如 CPU、RAM、I/O 等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发…...
Java面试趣事:从死循环到分段锁
互联网大厂Java开发岗终面现场 面试官(推了推黑框眼镜):马小帅是吧?先说下HashMap扩容机制? 马小帅(抓耳挠腮):这我知道!默认初始容量16,默认负载因子0.75..…...
健康养生新主张
健康养生并非遥不可及的高深学问,摒弃中医理念,从生活细节入手,同样能实现身心的良好养护,开启活力满满的生活。 水是生命之源,科学饮水对养生意义重大。每天饮用 1500 - 2000 毫升的水,可维持身体正常的…...
合成复用原则(CRP)
非常好!你已经学习了好几个设计原则,现在我们来讲解合成复用原则(Composite Reuse Principle, CRP)——它和继承是常被比较的一对“重用方式”。 🧠 一句话定义 合成复用原则(CRP):尽…...
基于PyTorch的食物图像分类实战:从数据处理到模型训练
基于PyTorch的食物图像分类实战:从数据处理到模型训练 在深度学习领域,图像分类是一个经典且应用广泛的任务。无论是在电商平台的商品分类、医疗影像诊断,还是在农业作物识别等场景中,图像分类模型都发挥着重要作用。本文将以食物…...
在pycharm profession 2020.3将.py程序使用pyinstaller打包成exe
一、安装pyinstaller 在pycharm的项目的Terminal中运行pip3 install pyinstaller即可。 安装后在Terminal中输入pip3 list看一下是否成功 二、务必在在项目的Terminal中输入命令打包,命令如下: python3 -m PyInstaller --noconsole --onefile xxx.py …...
基于Springboot旅游网站系统【附源码】
基于Springboot旅游网站系统 效果如下: 系统登陆页面 系统主页面 景点信息推荐页面 路线详情页面 景点详情页面 确认下单页面 景点信息管理页面 旅游路线管理页面 研究背景 随着互联网技术普及与在线旅游消费习惯的深化,传统旅游服务模式面临效率低、…...
Linux操作系统从入门到实战(五)详细讲解Linux权限概念
Linux操作系统从入门到实战(五)详细讲解Linux权限概念 前言一、Linux中两种用户1.1 超级用户(root)1.2 普通用户1.3 切换用户命令 二、Linux权限管理2.1 文件访问者的分类:谁能访问文件?2.2 文件类型2.3 基…...
[方法论]软件工程中的设计模式:从理论到实践的深度解析
文章目录 软件工程中的设计模式:从理论到实践的深度解析引言:为什么需要设计模式?第一部分:设计模式的核心原则1. SOLID 原则(面向对象设计的五大基石)2. 其他关键思想 第二部分:创建型模式&…...
测试基础笔记第十八天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、web自动化1.xpath定位1.属性定位2.属性与逻辑结合3.属性和层级结合 2.常见元素定位方法(面试题)3.常见元素定位失败原因4.cookie1.验证码…...
深度学习系统学习系列【2】之人工神经网络(ANN)
文章目录 说明人工神经网络概述基本单位(神经元模型)神经元基本模型线性模型与激活函数多层神经网络人工神经网络的注意内容 人工神经网络的阶段划分训练阶段输入、输出数据量化的设计权值向量W和偏置b的设计 预测阶段 人工神经网络核心算法梯度下降算法…...
《解锁Windows下GCC升级密码,开启高效编程新旅程》
《解锁Windows下GCC升级密码,开启高效编程新旅程》 为什么要升级 Windows 下的 GCC 版本? 在软件开发的动态领域中,GCC 作为一款卓越的编译器,在 Windows 环境下的升级有着重要意义,其影响深远且广泛。 从性能优化的角度来看,新版 GCC 往往在编译速度上有显著提升。随着…...
**Java面试大冒险:谢飞机的幽默与技术碰撞记**
互联网大厂Java求职者面试:一场严肃与搞笑交织的技术盛宴 场景: 互联网大厂面试间 人物: 面试官: 一位严肃的资深架构师,对技术要求严格。谢飞机: 一位搞笑的程序员,技术实力参差不齐。 第一…...
软件检测价格受多种因素影响,你了解多少?
软件检测价格受到多种因素的影响,这对企业来说至关重要,对开发者来说也至关重要,了解软件检测价格能够让企业和开发者更好地进行预算,能够让企业和开发者更好地进行决策。以下为你深入分析相关内容。 检测范围影响软件检测范围的…...
学习黑客风险Risk
一眼纵览 今天 Day 5 我们用 60 分钟打通「风险管理快闪副本」——先用漫画式视角速读两个国际标准(NIST & ISO/IEC 27005),再把抽象概念变身为炫彩 Risk Heat Map,最后亲手填一张迷你 风险登记簿。学完你将能: 讲…...
scikit-learn在监督学习算法的应用
shiyonguyu大家好,我是我不是小upper!最近行业大环境不是很好,有人苦恼别人都开始着手项目实战了,自己却还卡在 scikit-learn 的代码语法上,连简单的示例运行起来都磕磕绊绊。确实,对很多机器学习初学者来说…...
BG开发者日志505:项目总体情况
1、从2024年12月中旬启动,到4月底gameplay部分开发完毕,已经四个半月过去了。 其中大部分内容是3、4两个月中完成的,量产阶段。 预计6月初参加新品节,6月中旬发售(比原计划7月中旬提前一个月)。 --------…...
MySQL 空值处理函数对比:IFNULL、COALESCE 和 NULLIF
IFNULL、COALESCE 和 NULLIF这三个函数都是 MySQL 中处理 NULL 值的函数,但它们的功能和使用场景有所不同: 1. IFNULL(expr, fallback) 功能:两值处理,专为替换 NULL 设计 如果 expr 不是 NULL,返回 expr如果 expr …...
【2025年】MySQL面试题总结
文章目录 1. MySQL 支持哪些存储引擎?默认使⽤哪个?2. MyISAM 和 InnoDB 有什么区别?3. 事务的四大特性?4. 并发事务带来了哪些问题?5. 不可重复读和幻读有什么区别?6. MySQL 事务隔离级别?默认是什么级别࿱…...
Python 数据智能实战 (10):智能商品推荐 - LLM “猜你喜欢”
写在前面 —— 从协同过滤到语义理解:融合 LLM,打造更懂用户心意的个性化推荐 在之前的篇章里,我们已经见证了 LLM 在用户分群、购物篮分析、流失预测、内容生成等多个电商环节的赋能潜力。今天,我们将聚焦于电商平台的“心脏”之一,也是用户体验和商业转化的核心驱动力…...
2025年 蓝桥杯省赛 Python A 组题目
文章目录 A.偏蓝B.IPv6C.2025图形D.最大数字E.倒水F.拼好数G.登山H.原料采购 近期复盘一下 省赛的题目,正所谓知不足方能进步可以在洛谷找到比赛的题目,不过得注意由于python版本的问题,有些代码想要在洛谷上ac的话,需要对应调整代…...
shell(7)
运算符 1.基本介绍 这是shell进行运算的符号,依靠这些标识才能实现我们在脚本中的运算. 2.基本语法 1、$((运算符))或$[运算符]或expr m n 注意: expr运算符间有空格→如果不加空格会被当做一个整体不会进行运算 例子: 3.expr m - n,如果要将expr运算…...
LangChain与MCP:大模型时代的工具生态之争与协同未来
LangChain与MCP:大模型时代的工具生态之争与协同未来 ——从架构差异到应用场景的深度解析 引言 在大模型驱动的AI应用生态中,LangChain与Model Context Protocol (MCP) 代表了两种截然不同的技术路径:前者以灵活的工具链和开发者友好性著称…...
【LLaMA-Factory实战】Web UI快速上手:可视化大模型微调全流程
一、引言 在大模型微调场景中,高效的工具链能显著降低开发门槛。LLaMA-Factory的Web UI(LlamaBoard)提供了低代码可视化平台,支持从模型加载、数据管理到训练配置的全流程操作。本文将结合结构图、代码示例和实战命令,…...
源码编译Qt StateMachine
编译某个项目时报错提示fatal error: QSignalTransition: No such file or directory,是因为qtbase中没有包含StateMachine模块,需要qt/qtscxml.git - SCXML (state machine notation) compiler and related tools 编译安装qtscxml 执行如下步骤&#…...
C++ STL vector高级特性与实战技巧
引言 各位小伙伴们好!上一篇博客我们介绍了vector的基础知识和常见操作,今天我们将更深入地探讨vector的高级特性、内存管理细节以及实战应用技巧。 想象一下vector就像一辆能自动变长的公交车,我们上一篇讲了如何上下车(添加删…...
[Windows] Kazumi番剧采集v1.6.9:支持自定义规则+在线观看+弹幕,跨平台下载
[Windows] Kazumi番剧采集 链接:https://pan.xunlei.com/s/VOPLMhEQD7qixvAnoy73NUK9A1?pwdtu6i# Kazumi是一款基于框架; 开发的轻量级番剧采集工具,专为ACG爱好者设计。通过;自定义XPath规则; 实现精准内容抓取,支持多平台(An…...
二种MVCC对比分析
文章目录 前言MVCCInnodb的MVCC版本链回滚与提交可见性判断 Oracle的MVCC版本链 PostgreSQL的MVCCMVCC实现可见性判断特点 前言 MVCC(多版本并发控制,Multi-Version Concurrency Control)是一种数据库管理系统(DBMS&#x…...
Python蓝桥杯真题代码
以下是一些不同届蓝桥杯Python真题代码示例: 第十四届青少年蓝桥杯python组省赛真题 删除字符串后缀 input_str input("请输入一个字符串:") suffixes (er, ly, ing) for suffix in suffixes: if input_str.endswith(suffix): input_str …...