news 2026/4/17 13:59:17

Go语言的defer语句和Test功能测试函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Go语言的defer语句和Test功能测试函数

1.defer延迟语句

Go语言存在一种延迟执行的语句,有关键字defer标识,语法如下:

defer 任意语句

任意语句表示Go程序中的任何执行语句

以下是示例代码:

package main import "fmt" func main() { defer fmt.Println("这是最后执行的语句") fmt.Println("这是第一个执行的语句") fmt.Println("这是第二个执行的语句") }

运行结果

这是第一个执行的语句
这是第二个执行的语句
这是最后执行的语句

defer关键字会将其后面跟随的语句进行延迟处理,defer归属的函数即将返回时,将延迟处理的语句按defer出现的顺序逆序执行

在日常处理业务逻辑的工作中,成对的操作是比较繁琐的事情。在这些操作中,十分容易忽略的就是在每个函数退出时正确地释放资源,使用defer能十分方便地处理资源释放问题

2.Test功能测试函数

Go语言中有自带testing测试包,可以进行自动化的单元测试和性能测试

我们为啥需要测试呢?因为完善的测试体系能够提高开发效率、保证代码的质量。当项目足够复杂的时候,想要尽可能的减少bug,就需要进行代码审核和测试。Go语言的testing包提供了3种测试方式:单元(功能)测试、性能(压力)测试、覆盖率测试

单元(功能)测试

单元测试用于验证代码的最小可测试单元(如函数或方法)的正确性。Go的testing包通过TestXxx函数实现,文件名需以_test.go结尾,测试函数以Test开头,参数为*testing.T

注意事项

  • 测试函数必须接受*testing.T参数,且无返回值。
  • 使用t.Errort.Fatal报告失败。
  • 避免测试间依赖,确保独立性。

示例代码:

// math.go func Add(a, b int) int { return a + b } // math_test.go func TestAdd(t *testing.T) { result := Add(2, 3) if result != 5 { t.Errorf("Expected 5, got %d", result) } }

性能(压力)测试

性能测试通过BenchmarkXxx函数实现,用于衡量代码执行效率。函数以Benchmark开头,参数为*testing.B,通过b.N动态调整迭代次数。

注意事项

  • 避免在循环内初始化耗时代码,应放在b.ResetTimer()之后。
  • 使用-benchmem标志分析内存分配。

示例代码:

func BenchmarkAdd(b *testing.B) { for i := 0; i < b.N; i++ { Add(1, 2) } }

运行命令:

go test -bench=. -benchmem

覆盖率测试

覆盖率测试统计代码被测试执行的比例。通过-cover标志生成报告,或使用-coverprofile输出详细数据。

注意事项

  • 目标覆盖率通常为70%-90%,关键逻辑需接近100%。
  • 结合go tool cover分析未覆盖的代码路径。

示例
运行覆盖率测试:

go test -cover

生成HTML报告:

go test -coverprofile=coverage.out && go tool cover -html=coverage.out
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 13:51:58

LeetCode(移动零)

题目链接&#xff1a; https://leetcode.cn/problems/move-zeroes/ 题目描述&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作…

作者头像 李华
网站建设 2026/4/17 13:51:02

SecGPT-14B实战教程:Chainlit自定义UI添加威胁情报查询插件

SecGPT-14B实战教程&#xff1a;Chainlit自定义UI添加威胁情报查询插件 1. 从模型到应用&#xff1a;为什么需要自定义插件&#xff1f; 你部署好了SecGPT-14B&#xff0c;也通过Chainlit界面问了几个安全基础问题&#xff0c;模型回答得不错。但你可能很快会发现一个问题&am…

作者头像 李华
网站建设 2026/4/17 13:49:34

终极简单:LogcatReader安卓日志查看器完整使用指南

终极简单&#xff1a;LogcatReader安卓日志查看器完整使用指南 【免费下载链接】LogcatReader A simple app for viewing logcat logs on an android device. 项目地址: https://gitcode.com/gh_mirrors/lo/LogcatReader LogcatReader是一款专为安卓设备设计的轻量级日志…

作者头像 李华