Go语言特有函数defer语句Test功能测试函数01.02.目录01defer语句•defer语句定义•defer使用环境•Go语言的defer语句会将其后面跟随的语句进行延迟处理•在defer归属的函数即将返回时,将延迟处理的语句按defer的逆序进行执行•即先被defer的语句最后被执行,最后被defer的语句最先被执行•因为defer语句是在当前函数即将返回时被调用,所以defer常常被用来释放资源defer语句1defer语句defer任意语句语法格式1defer语句packagemainimport"fmt"funcmain(){fmt.Println("deferbegin")deferfmt.Println(1)deferfmt.Println(2)deferfmt.Println(3)fmt.Println("deferend")}•当有多个defer行为被注册时,它们会以逆序执行(类似于栈:后进先出)•延迟调用是在defer所在函数结束时进行运行结果为:deferbegindeferend321•在日常工作中处理业务或逻辑中涉及成对的操作是一件比较烦琐的事情,比如打开和关闭文件、接收请求和回复请求、加锁和解锁等•在这些操作中,最容易忽略的就是在每个函数退出处正确地释放和关闭资源•而defer语句正好是在函数退出时执行的语句,所以使用defer能非常方便地处理资源释放问题。1defer语句defer的资源释放02Test功能测试函数•单元测试•性能测试•覆盖率测试•编写测试用例注意事项•常用测试参数•完善的测试体系能够提高开发的效率•当项目复杂的时候,想要保证尽可能的减少bug,有两种有效的方式分别是代码审核和测试•Go语言中提供了testing包来实现单元测试功能,可以进行自动化的单元测试,输出结果验证,并且可以测试性能测试的意义testing包的三种测试单元(功能)测试性能(压力)测试覆盖率测试2Test功能测试函数2Test功能测试函数•测试用例文件不会参与正常源码的编译,不会被包含到可执行文件中•测试用例的文件名必须以_test.go结尾•需要使用import导入testing包•测试函数的名称要以Test或Benchmark开头,后面可以跟任意字母组成的字符串,但第一个字母必须大写,例如TestAbc(),一个测试用例文件中可以包含多个测试函数•单元测试则以(t*testing.T)作为参数,性能测试以(t*testing.B)做为参数•测试用例文件使用gotest命令来执行,源码中不需要main()函数作为入口,所有以_test.go结尾的源码文件内以Test开头的函数都会自动执行测试规则gotest命令会自动读取源码目录下面名为*_test.go的文件,生成并运行测试用的可执行文件语法格式gotest[-c][-i][buildflags][packages][flagsfortestbinary]•-c:编译gotest成为可执行的二进制文件,但是不运行测试•-i:安装测试包依赖的package,但是不运行测试•buildflags:调用gohelpbuild,这些是编译运行过程中需要使用到的参数,一般设置为空•packages:调用gohelppackages,这些是关于包的管理,一般设置为空•flagsfortestbinary:调用gohelptestflag,这些是gotest过程中经常使用到的参数2Test功能测试函数2Test功能测试函数•单元就是人为规定的最小的被测功能模块•作用:对软件中的最小可测试单元进行检查和验证•单元测试是在软件开发过程中要进行的最低级别的测试活动•软件的独立单元将在与程序的其他部分相隔离的情况下进行测试单元(功能)测试import"testing"funcTestXxx(t*testing.T){//......}测试语法E:\go\demo\demo.go文件:packagedemofuncGetArea(weightint,heightint)int{returnweight*height}E:\go\demo\demo_test.go文件:packagedemoimport"testing"funcTestGetArea(t*testing.T){area:=GetArea(40,50)ifarea!=2000{t.Error("测试失败")}}测试结果为:E:\go\demo>gotest-v===RUNTestGetArea---PASS:TestGetArea(0.00s)PASSokgin/demo0.810s2Test功能测试函数2Test功能测试函数•性能测试是指:可以给出代码的性能数据,帮助测试者分析性能问题•性能测试也称基准测试,基准测试可以测试一段程序的运行性能及耗费CPU的程度•Go语言中提供了基准测试框架,使用方法类似于单元测试•使用者无须准备高精度的计时器和各种分析工具,因为基准测试本身即可以打印出非常标准的测试报告性能(压力)测试E:\go\demo\demo.go文件:packagedemofuncGetArea(weightint,heightint...