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&#…...

一个局域网通过NAT访问另一个地址重叠的局域网(IP方式访问)
正文共:1335 字 7 图,预估阅读时间:4 分钟 现在,我们已经可以通过调整两台设备的组合配置(地址重叠时,用户如何通过NAT访问对端IP网络?)或仅调整一台设备的配置(仅操作一…...

05-机器学习-数据标注
一、学习数据标注的核心目标 数据标注不仅是“打标签”,而是理解数据与AI模型之间的桥梁。需要掌握: 标注技术:不同任务类型的标注方法(如分割、实体识别)。标注工具:高效使用专业工具(如CVAT…...

LQ1052 Fibonacci斐波那契数列
题目描述 Fibonacci斐波那契数列也称为兔子数列,它的递推公式为:FnFn-1Fn-2,其中F1F21。 当n比较大时,Fn也非常大,现在小蓝想知道,Fn除以10007的余数是多少,请你编程告诉她。 输入 输入包含一…...

AWTK 骨骼动画控件发布
Spine 是一款广泛使用的 2D 骨骼动画工具,专为游戏开发和动态图形设计设计。它通过基于骨骼的动画系统,帮助开发者创建流畅、高效的角色动画。本项目是基于 Spine 实现的 AWTK 骨骼动画控件。 代码:https://gitee.com/zlgopen/awtk-widget-s…...

分库分表后如何进行join操作
在分库分表后的系统中,进行表之间的 JOIN 操作比在单一数据库表中复杂得多,因为涉及的数据可能位于不同的物理节点或分片中。此时,传统的 SQL JOIN 语句不能直接用于不同分片的数据,以下是几种处理这样的跨分片 JOIN 操作的方法&a…...

arkui-x 前端布局编码模板
build() {Column() {Row() {// 上侧页面布局实现}// 下侧页面布局实现}.width(Const.THOUSANDTH_1000).height(Const.THOUSANDTH_1000).justifyContent(FlexAlign.SpaceBetween).backgroundImage($r(app.media.background_xxx)).backgroundImageSize(ImageSize.Cover).backgrou…...

宝塔面板SSL加密访问设置教程
参考:https://www.bt.cn/bbs/thread-117246-1-1.html 如何快速使用证书加密访问面板 因早期默认未开启https访问所以没有相关的风险提醒,现面板默认已开启https加密访问、提升安全性 由于采用的是服务器内部本身签发证书,不被公网浏览器信任请参考以下步…...

c++ set/multiset 容器
1. set 基本概念 简介: 所有元素都会在插入时自动排序本质: set/multiset属于关联式容器,底层结构是用二叉树实现。set 和 multiset 区别: set容器不允许有重复的元素。 multiset允许有重复的元素。2. set 构造和赋值 构造&a…...

前部分知识复习02
一、物体的屏幕UV坐标 float2 ScreenUV i.pos.xy / _ScreenParams.xy; 二、抓取屏幕图像 GrabPass{" _A "} //_A为贴图图像名称 之后需在Pass中声明该贴图才能在Pass中引用此贴图 三、屏幕抓取并制作热效应代码 Shader"unity/HeatDistort 07" {Pr…...

开发环境搭建-3:配置 JavaScript 开发环境 (fnm+ nodejs + pnpm + nrm)
在 WSL 环境中配置:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网:https://nodejs.org/zh-cn/download 点击【下载】,选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…...