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.Error或t.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