golang命令大全4--测试与调试
Go 语言提供了一系列强大的工具和命令来帮助开发者进行代码的测试与性能调优。
1、go test
功能
go test是 Go 语言内置的测试工具,用于执行 Go 项目中的单元测试。它会查找当前包中所有以 `_test.go` 结尾的文件,运行其中定义的测试函数,并报告测试结果。
使用方法
go test [选项] [包名]
常用选项
- -v:显示详细的测试输出。
- -run:运行匹配指定正则表达式的测试函数。
- -cover:显示测试的覆盖率信息。
- -bench:运行基准测试。
示例
- 执行当前目录下的所有测试:
$ go test
- 执行带有详细输出的测试:
$ go test -v
- 运行匹配正则表达式的测试函数(例如,只运行包含 TestAdd 的测试):
$ go test -run "TestAdd"
- 运行并显示测试覆盖率:
$ go test -cover
应用场景
- 单元测试:确保每个函数按预期工作。
- 集成测试:确保多个组件协同工作。
- 回归测试:验证代码变动没有破坏已有功能。
2、go benchmark
功能
go benchmark 是 Go 提供的一种基准测试工具,用于衡量代码的执行性能。它可以用来测试函数的执行时间、内存分配等性能指标,从而帮助开发者优化性能瓶颈。
使用方法
go test -bench [正则表达式]
示例
在测试中运行基准测试,显示性能指标:
$ go test -bench .
只运行匹配某个函数的基准测试:
$ go test -bench "TestAdd"
使用 -benchmem 显示内存分配的相关信息:
$ go test -bench . -benchmem
应用场景
- 性能测试:衡量代码的执行效率。
- 优化:识别性能瓶颈并进行相应的优化。
- 比较:对比不同实现的性能表现。
3、go tool pprof
功能
go tool pprof 是 Go 提供的性能分析工具,可以帮助开发者分析程序运行时的 CPU 使用情况、内存分配、堆栈等。它能够生成详细的性能报告,帮助识别性能瓶颈。
基本语法
go tool pprof [可执行文件] [性能报告]
示例
在程序中启动性能分析(通常是在代码中导入 net/http/pprof,并监听一个端口):
import _ "net/http/pprof"
import "net/http"
go func() {
log.Println(http.ListenAndServe("localhost:6060", nil))
}()
在运行程序时,通过 curl 获取性能数据:
$ curl http://localhost:6060/debug/pprof/profile?seconds=30 > cpu.pprof
使用 go tool pprof 加载性能报告:
$ go tool pprof cpu.pprof
在 pprof 提示符下,使用以下命令生成不同的性能报告:
- top:显示 CPU 占用最多的函数。
- list:显示指定函数的代码级别性能分析。
- web:生成 SVG 格式的图表。
(pprof) top
(pprof) list MyFunction
(pprof) web
应用场景
- 性能分析:深入了解代码执行过程中的性能瓶颈。
- 内存分析:识别内存泄漏或过多的内存分配。
- CPU 使用率优化:分析高 CPU 占用的函数,优化执行效率。
4、go test 和 go benchmark 的结合
go test 和 go benchmark 常常一起使用,以确保代码不仅能正确运行,而且具有良好的性能。Go 语言的测试框架支持在同一个测试文件中同时进行功能测试和性能测试。
示例:结合单元测试和基准测试
package mainimport ("testing"
)// 测试功能
func TestAdd(t *testing.T) {result := Add(2, 3)if result != 5 {t.Errorf("Expected 5, got %d", result)}
}// 基准测试
func BenchmarkAdd(b *testing.B) {for i := 0; i < b.N; i++ {Add(2, 3)}
}
执行单元测试和基准测试:
$ go test -v
$ go test -bench .
应用场景
- 在开发过程中进行回归测试和性能测试。
- 监控性能的提升或退步。
5、注意事项与最佳实践
合理组织测试代码:
- 确保每个功能单元都有对应的单元测试,保持代码的健壮性。
- 在测试中覆盖可能的边界条件和异常情况。
注重基准测试:
- 在开发中,尽早进行基准测试,避免后期性能问题。
- 确保基准测试的稳定性,避免因环境变化导致不准确的结果。
分析 pprof 报告:
- 使用 go tool pprof 定期分析程序性能,特别是在处理高并发或高负载的系统时。
- 结合 pprof 分析结果优化 CPU 和内存的使用。
持续集成与自动化测试:
- 在持续集成中集成 go test 和 go benchmark,自动执行单元测试和基准测试,确保代码质量和性能持续稳定。
通过本文,开发者可以掌握 Go 中常用的测试与调试工具,能够有效地确保代码的正确性和性能,并通过性能分析工具对潜在的瓶颈进行优化。在下一章中,我们将深入探讨 Go 语言中的代码依赖相关命令。敬请期待!
相关文章:
golang命令大全4--测试与调试
Go 语言提供了一系列强大的工具和命令来帮助开发者进行代码的测试与性能调优。 1、go test 功能 go test是 Go 语言内置的测试工具,用于执行 Go 项目中的单元测试。它会查找当前包中所有以 _test.go 结尾的文件,运行其中定义的测试函数,并…...
第27篇 基于ARM A9处理器用C语言实现中断<三>
Q:基于ARM A9处理器怎样设计C语言工程,同时使用按键中断和定时器中断在红色LED上计数? A:基本原理:设置HPS Timer 0和按键中断源,主程序调用set_A9_IRQ_stack( )函数设置中断模式的ARM堆栈指针,…...
linux下使用脚本实现对进程的内存占用自动化监测
linux系统中常用cat /proc/{pid}/status和pmap -x {pid}来监测某个进程的内存资源占用情况。 其中注意各参数的含义如下: VmSize:表示进程当前虚拟内存大小 VmPeak:表示进程所占用最大虚拟内存大小 VmRSS:表示进程当前占用物理内…...
安宝特方案 | 智能培训:安宝特AR如何提升企业技能培训的效率与互动性
随着企业不断推进数字化转型,传统培训方式已无法满足现代企业对高效、灵活培训的需求。尤其在技术更新频繁、工艺流程复杂、员工流动性大的环境中,传统培训模式的局限性愈加明显。为了提升培训质量、降低培训成本,并帮助员工迅速掌握新技能&a…...
golang通过AutoMigrate方法自动创建table详解
一.AutoMigrate介绍 1.介绍 在 Go 语言中,GORM支持Migration特性,支持根据Go Struct结构自动生成对应的表结构,使用 GORM ORM 库的 AutoMigrate 方法可以自动创建数据库表,确保数据库结构与定义的模型结构一致。AutoMigrate 方法非常方便&am…...
【信息系统项目管理师-选择真题】2013上半年综合知识答案和详解
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20题】【第…...
智能调度体系与自动驾驶技术优化运输配送效率的研究——兼论开源AI智能名片2+1链动模式S2B2C商城小程序的应用潜力
摘要:随着全球化和数字化进程的加速,消费者需求日益呈现出碎片化和个性化的趋势,这对物流运输行业提出了前所未有的挑战。传统的物流调度体系与调度方式已难以满足当前复杂多变的物流需求,因此,物流企业必须积极引入大…...
【软件测试项目实战 】淘宝网:商品购买功能测试
一、用例设计方法分析 在对淘宝网商品下单功能进行测试时,不同的测试角度和场景适合运用不同的用例设计方法,以下是针对该功能各方面测试所适用方法及其原因的分析: 商品数量相关测试:对于商品数量的测试,主要采用等…...
[牛客]公交线路(dijkstra+链式前向星)
登录—专业IT笔试面试备考平台_牛客网 #include<bits/stdc.h> using namespace std; #define endl \n typedef long long ll; const int N1e65,M1e85; int cnt0,head[N]; int n,m,s,t; struct node {int v,w,next; }edge[M]; void addedge(int u,int v,int w) {cnt;edge…...
SpringAI 搭建智能体(二):搭建客服系统智能体
在现代人工智能应用中,智能体(Agent) 是一个重要的概念,它的核心能力是自主性与灵活性。一个智能体不仅能够理解用户的需求,还能拆解任务、调用工具完成具体操作,并在复杂场景中高效运行。在本篇博客中&…...
豆包MarsCode:前缀和计算问题
问题描述 思路分析 问题理解 小S的任务是计算一个整数数组 nums 的前缀和。前缀和是指从数组开始到某个位置的所有元素的累加值,形成一个新数组。例如: 输入数组:nums [4, 5, 1, 6]前缀和数组:[4, 9, 10, 16] 4 49 4 510 …...
【16届蓝桥杯寒假刷题营】第2期DAY5
2.最大公因数 - 蓝桥云课 问题描述 给你2个正整数N,M。 你需要构造一个有N个数的正整数序列a,满足以下条件: ∑i1NaiM。 求gcd(a),可能的最大值。 输入描述 输入一行两个正整数N,M,表示数组的长…...
Python 合并 Excel 单元格
合并 Excel 单元格是 Excel 数据处理和表格设计中的一项常用操作。例如,在制作表格标题时,经常会将多个单元格合并,使标题能够跨列显示,更加醒目和美观。此外,当对数据进行分类时,为了使同一类别的数据在视…...
[EAI-023] FAST: Efficient Action Tokenization for Vision-Language-Action Models
Paper Card 论文标题:FAST: Efficient Action Tokenization for Vision-Language-Action Models 论文作者:Karl Pertsch, Kyle Stachowicz, Brian Ichter, Danny Driess, Suraj Nair, Quan Vuong, Oier Mees, Chelsea Finn, Sergey Levine 论文链接&…...
解锁微服务:五大进阶业务场景深度剖析
目录 医疗行业:智能诊疗的加速引擎 电商领域:数据依赖的破局之道 金融行业:运维可观测性的提升之路 物流行业:智慧物流的创新架构 综合业务:服务依赖的优化策略 医疗行业:智能诊疗的加速引擎 在医疗行业迈…...
java入门笔记基础语法篇(4)
变量 在Java中,每个变量都有一个类型(type)。在声明变量时,变量的类型位于变量 名之前。例如: int days; double salary; long earthPopulation; boolean done; 在Java中,每个声明以分号结束。变量名必须…...
java语法学习
目录 一、基础语法 1.注释 2.关键字 3.字面量 4.变量 定义与使用 存储 5.数据类型 6.标识符 7.集成环境 二、运算符 1.概念 2.种类 算术运算符 除法与取模 转化规则 自增减 赋值运算符 关系运算符 逻辑运算符 短路运算符 三元运算符 其它运算符 三、流…...
装饰SpringMVC的适配器实现响应自动包装
文章目录 1.common-tool-starter1.目录结构2.ResultWrapper.java 2.common-web-starter1.目录结构2.IgnoredResultWrapper.java 自定义注解,忽略对返回结果的自动包装3.ReturnValueHandlersDecorator.java 对适配器进行扩展的装饰器4.WebAutoConfiguration.java 将装…...
【Rust自学】15.4. Drop trait:告别手动清理,释放即安全
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 15.4.1. Drop trait的意义 类型如果实现了Drop trait,就可以让程序员自定义当值…...
【算法】【归并排序】AcWing 算法基础 788. 逆序对的数量
题目 给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。 逆序对的定义如下:对于数列的第 i个和第 j 个元素,如果满足 i<j且 a[i]>a[j],则其为一个逆序对;否则不是。 输入格式 第一行包含整数 n&#…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...
关于 ffmpeg设置摄像头报错“Could not set video options” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148515355 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
